从另一个没有数据的表的结构创建表

Posted

技术标签:

【中文标题】从另一个没有数据的表的结构创建表【英文标题】:Creating table from structure of another table with no data 【发布时间】:2010-02-19 11:10:31 【问题描述】:

如何在 SQL (MS SQL) 中实现这一点

谢谢

好的:让我澄清一下我想要实现的是生成带有 EXCEPT 子句的动态选择语句。

例如:从@table 中选择 col1,col2,col3 除了 从@table 中选择 col1,col2,col2

所以我的结果集总是会根据@table而有所不同

接下来我想在 CTE 中使用这个@table

使用过滤数据 作为 ( 从 temptable 中选择 col1、col2 --(在上面创建) )

下面是目前的代码:

    DECLARE @TABLENAME VARCHAR(200) = 'SERVICE_DELIVERY_LOCATION';
DECLARE @COLCOUNT INT ;
DECLARE @TEMPCOLNAME VARCHAR(500) ;
DECLARE @SELECTCOLUMNS VARCHAR(5000)='';
DECLARE @EXCEPTSTATEMENT VARCHAR(5000)='' ;

---------------------------------------------------------------------------------------------------
--CASE: GET COMMON_COLUMNS COLUMNS OF SOURCE AND DESTINATION TABLE
---------------------------------------------------------------------------------------------------
DECLARE @COMMON_COLUMNS TABLE( COLUMN_NAME VARCHAR(500))
INSERT  INTO @COMMON_COLUMNS 
    SELECT  SOURCE.COLUMN_NAME FROM   SCD_SOURCE.INFORMATION_SCHEMA.COLUMNS SOURCE
    INNER JOIN SCD_DESTI.INFORMATION_SCHEMA.COLUMNS DESTI ON SOURCE.COLUMN_NAME = DESTI.COLUMN_NAME


---------------------------------------------------------------------------------------------------
--CASE: GET PK COLUMNS OF SOURCE TO MAP TO DESTINATION IN CASE WHERE NEED TO DO UPDATES
---------------------------------------------------------------------------------------------------
DECLARE @PK_COLUMNS TABLE ( PK_COLUMN VARCHAR(500))
INSERT INTO @PK_COLUMNS
    SELECT KCU.COLUMN_NAME
    FROM    SCD_SOURCE.INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC  
    JOIN    SCD_SOURCE.INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU ON KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA  
        AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME  
        AND KCU.TABLE_SCHEMA = TC.TABLE_SCHEMA  
        AND KCU.TABLE_NAME = TC.TABLE_NAME 
        AND KCU.COLUMN_NAME !=  'CREATE_DATA_CONTAINER_ID'
    WHERE TC.CONSTRAINT_TYPE IN ('PRIMARY KEY') 


SELECT  @COLCOUNT = COUNT(*) FROM @COMMON_COLUMNS

WHILE ( @COLCOUNT != 0 )
    BEGIN
        SET @TEMPCOLNAME = (SELECT TOP 1 COLUMN_NAME FROM @COMMON_COLUMNS)
        SET @SELECTCOLUMNS = @SELECTCOLUMNS + @TEMPCOLNAME + ', '
        DELETE FROM @COMMON_COLUMNS WHERE COLUMN_NAME = @TEMPCOLNAME
        SELECT  @COLCOUNT = COUNT(*) FROM @COMMON_COLUMNS
    END

SET @SELECTCOLUMNS = SUBSTRING(@SELECTCOLUMNS, 1, LEN(@SELECTCOLUMNS) - 1)

SET @EXCEPTSTATEMENT = 'SELECT ' + @SELECTCOLUMNS + ' FROM SCD_SOURCE.DBO.' + @TABLENAME + ' EXCEPT SELECT ' + @SELECTCOLUMNS + ' FROM SCD_DESTI.DBO.' + @TABLENAME
EXEC(@EXCEPTSTATEMENT)

希望最后一行的结果集到 temptable 中

谢谢

【问题讨论】:

程序是否必须创建具有相同架构的新表?如果它是由人类 anthares 完成是正确的。 【参考方案1】:
SELECT TOP 0 *
INTO NewTable
FROM OriginalTable

这将复制结构,但不会复制约束等。 如果你想要一切,最好的办法就是从 SSMS 生成脚本并更改表/约束/索引名称。

编辑: 回复:“希望最后一行的结果集进入 temptable”

您可以将最后两行更改为:

SET @EXCEPTSTATEMENT = 'SELECT * INTO MyNewTable FROM (SELECT ' + @SELECTCOLUMNS + ' FROM SCD_SOURCE.DBO.' + @TABLENAME + ' EXCEPT SELECT ' + @SELECTCOLUMNS + ' FROM SCD_DESTI.DBO.' + @TABLENAME + ') x'
EXECUTE(@EXCEPTSTATEMENT)

这会将结果集放入“真实”表中;或者,您必须使用全局临时表(只需将“MyTable”更改为“##MyTable”)。它不适用于本地临时表(“#MyTable”),因为它的范围将在 EXECUTE 语句内,即在 EXECUTE 之后,您不能拥有查询本地临时表的代码,因为它不会存在于那个范围内。因此,它需要是一个真实的表,或者一个全局临时表(可以在当前范围之外访问)/

【讨论】:

或者 create new_table as select * from old_table WHERE 1=2 感谢指正,确切的说法是:“select * into MyNewTableName from TheOldTable where 1=2;” - 在 SQL Server 2005 上对其进行了尝试和测试。复制架构不受限制。【参考方案2】:

打开您的管理工作室,右键单击您的表并创建到 -> 新查询窗口。这将生成用于创建具有索引约束等的表的精确副本的查询...

【讨论】:

【参考方案3】:

我之前用过this answer/脚本。

【讨论】:

【参考方案4】:
SELECT *
INTO NewTable
FROM OriginalTable
WHERE 1 = 0

【讨论】:

以上是关于从另一个没有数据的表的结构创建表的主要内容,如果未能解决你的问题,请参考以下文章

在 Access 中从另一个表的数据创建一个表

如何在从另一个表中提取数据时创建具有约束的表

如何从mysql数据库中获取一个表的表结构

Rails 创建没有迁移的表

ORACLE 创建一个表

Oracle 基础——视图