我有一个表BigTable和一个表LittleTable。我想将BigTable中某些记录的副本移动到LittleTable中,然后(对于这些记录)将BigTable.ExportedFlag设置为T(表示记录的副本已移动到小表)。 / p>
有没有办法在一个声明中这样做?
我知道我可以进行交易:
我还调查了MERGE statement,这似乎不太正确,因为我不想更改小表中的值,只需将记录移动到小表。
我在更新语句后查看了OUTPUT clause,但找不到有用的示例。我不明白为什么Pinal Dave使用的是Inserted.ID, Inserted.TEXTVal, Deleted.ID, Deleted.TEXTVal
而不是Updated.TextVal
。更新是否被视为插入或删除?
我发现这篇文章TSQL: UPDATE with INSERT INTO SELECT FROM说“AFAIK,你不能用一个sql语句更新两个不同的表。”
这是否有干净的单一声明?我正在寻找一个正确的,可维护的SQL语句。我是否必须在一个事务中包装两个语句?
答案 0 :(得分:7)
只要OUTPUT
满足要求LittleTable
OUTPUT ... INTO
子句
UPDATE BigTable
SET ExportedFlag = 'T'
OUTPUT inserted.Col1, inserted.Col2 INTO LittleTable(Col1,Col2)
WHERE <some_criteria>
如果您使用INSERTED
或DELETED
,则没有任何区别。唯一不同的列是您要更新的列(deleted.ExportedFlag
具有前值,inserted.ExportedFlag
将为T
)