我有2个具有相同模式的表(一个是临时表)
临时表和主表都有几行相同。
我需要更新主表,其中temptable上存在相同的条目。
最好的方法是什么。
这些表有100多列。那么有可能在没有列出查询中的所有列的情况下这样做吗?
非常感谢
答案 0 :(得分:3)
您需要使用MERGE语句。一个很好的指南是http://technet.microsoft.com/en-us/library/bb522522.aspx
现在,就列出列而言,只需使用唯一键来确定行是否通用。
答案 1 :(得分:2)
您可以动态构建查询。我不认为这是一个特别优雅的解决方案,但它可以做到这一点:
DECLARE @TableName VARCHAR(100),
@FlagColumn VARCHAR(100)
SET @TableName = 'TestTable'
SET @FlagColumn = 'FlagColumn'
-- BUILD THE TEMPORARY TABLE
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'SELECT * INTO ##' + @TableName + ' FROM ' + @TableName
EXEC(@SQL)
-- DO STUFF
-- BUILD SQL FOR MERGE STATEMENT
SET @SQL = ''
SELECT @SQL = @SQL + ' AND main.' + COLUMN_NAME + ' = temp.' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME != @FlagColumn
SET @SQL = 'MERGE INTO ' + @TableName + ' main USING ##' + @TableName + ' temp ON ' + STUFF(@SQL, 1, 5, '') +
' WHEN MATCHED THEN UPDATE SET ' + @FlagColumn + ' = 1;'
-- EXECUTE MERGE STATEMENT
EXEC (@SQL)
-- DROP TEMP TABLE
SET @SQL = 'DROP TABLE ##' + @TableName
EXEC (@SQL)
这比必要的更动态,并且可以简化,因为没有一个临时表的东西需要动态完成,我刚刚完成了这个,因为我不知道你的表名或你的临时表名。
我通过创建下表对此进行了测试:
CREATE TABLE TestTable (FlagColumn BIT)
DECLARE @i INT = 1
DECLARE @SQL VARCHAR(MAX)
WHILE @i < 100
BEGIN
SET @SQL = 'ALTER TABLE TestTable ADD COLUMN' + CONVERT(VARCHAR, @i) + ' INT'
EXEC (@SQL)
SET @i = @i + 1
END
答案 2 :(得分:1)
update MyTable set
ColumnX = ?? /* Update the columns your require to the new values */
, ColumnY = ??
from MyTable, MyTempTable T
where MyTable.ColumnA = T.ColumnA
and MyTable.ColumnB = T.ColumnB
/* Add as many conditions as necessary to be a match */
如果列可以为null,则必须将其处理为:
where ((MyTable.ColumnA is null and T.ColumnA isn null) or MyTable.ColumnA = T.ColumnA)
或者如果您知道某个特定值无效,因为您可以在标识列中执行0
where isnull(MyTable.ColumnA,0) = isnull(T.ColumnA,0)
答案 3 :(得分:1)
也许您正在寻找Intersect。查询:
select *
from TableA
intersect
select *
from TableB
检索两个集合中找到的行。
至于百列问题,打开Sql Server Management Studio,在表中找到你的表,右键单击并选择“Script table as”,然后“Insert to”,然后“New query window”得到逗号分隔列表列。