2010-02-19 24 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 
相關問題