2010-02-19 86 views
5

这又如何在SQL(MS SQL)来实现创建另一个表的结构表无数据

感谢

OK:让我有点不清楚什么我试图acheive正在生成动态的select语句EXCEPT子句。

例如:选择COL1,COL2,从@table COL3除了 选择COL1,COL2,从@table

COL2所以我的结果集将根据@table

futher下来,我想总是不同以使用该@table在CTE

与filteredData 如 ( 选择COL1,COL2从不是Temptable - (上面创建) )

以下

是迄今为止代码:

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

感谢

+0

程序是否必须使用相同的模式创建新表?如果它是由人类anthares完成是正确的。 – awright18 2010-02-19 13:03:38

回答

7
SELECT TOP 0 * 
INTO NewTable 
FROM OriginalTable 

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

编辑: 回复: “希望最后一行的结果集为不是Temptable”

你可以改变的最后2行:

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之后,你不能有代码,然后查询本地临时表,因为它不会存在于该范围内。因此,它将需要一个真正的表格或全球临时表格(可在当前范围之外访问)/

+0

或创建new_table作为select * from old_table WHERE 1 = 2 – 2010-02-19 12:39:54

+2

@KMan,这不适用于SQL Server – AdaTheDev 2010-02-19 12:51:15

+0

感谢您的更正,确切的语句如下所示:“从TheOldTable选择*到MyNewTableName,其中1 = 2;” - 在SQL Server 2005上试用并测试过它。没有限制地复制模式。 – 2010-02-19 13:11:03

4

打开您的管理工作室,右键单击您的表格并创建至 - > New Query窗口。这将生成查询创建您的表的确切副本与索引约束等...

1
SELECT * 
INTO NewTable 
FROM OriginalTable 
WHERE 1 = 0 
相关问题