在一个SQL语句中插入和更新记录?

时间:2012-09-13 13:36:00

标签: tsql

我有一个表BigTable和一个表LittleTable。我想将BigTable中某些记录的副本移动到LittleTable中,然后(对于这些记录)将BigTable.ExportedFlag设置为T(表示记录的副本已移动到小表)。 / p>

有没有办法在一个声明中这样做?

我知道我可以进行交易:

  1. 根据where子句
  2. 移动大表中的记录
  3. 根据同一个where子句更新导出到T的大表设置。
  4. 我还调查了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语句。我是否必须在一个事务中包装两个语句?

1 个答案:

答案 0 :(得分:7)

只要OUTPUT满足要求LittleTable

,您就可以使用OUTPUT ... INTO子句
UPDATE BigTable
SET ExportedFlag = 'T'
OUTPUT inserted.Col1, inserted.Col2 INTO LittleTable(Col1,Col2)
WHERE <some_criteria>

如果您使用INSERTEDDELETED,则没有任何区别。唯一不同的列是您要更新的列(deleted.ExportedFlag具有前值,inserted.ExportedFlag将为T