如何在SQL(MS SQL)中实现这一目标
谢谢
好的:让我清楚一下,尝试实现的是使用EXCEPT子句生成动态select语句。
例如:从@table中选择col1,col2,col3 除了 从@table
中选择col1,col2,col2所以我的结果集总是会根据@table
而不同进一步下来我想在CTE中使用这个@table
with filteredData 如 ( 从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
感谢
答案 0 :(得分:7)
SELECT TOP 0 *
INTO NewTable
FROM OriginalTable
这将复制结构,但不会复制约束等。 如果你想要一切,最好的办法就是从SSMS生成脚本并更改表/约束/索引名称。
修改强>
Re:“想要将最后一行的结果集转化为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之后,您不能拥有随后查询本地临时表的代码,因为它不会存在于该范围内。因此,它需要是一个真实的表,或一个全局临时表(可以在当前范围之外访问)/
答案 1 :(得分:4)
打开您的管理工作室,右键单击您的表格并创建至 - >新查询窗口。这将生成用于创建具有索引约束等的表的精确副本的查询...
答案 2 :(得分:1)
SELECT *
INTO NewTable
FROM OriginalTable
WHERE 1 = 0
答案 3 :(得分:1)
之前我使用过this answer /脚本。