5

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

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

我知道我可以进行以下交易:

  1. 根据 where 子句从大表中移动记录
  2. 根据同样的 where 子句更新导出到 T 的大表设置。

我还研究了一个MERGE 语句,这似乎不太正确,因为我不想更改小表中的值,只需将记录移动到小表中。

我在更新语句之后查看了OUTPUT 子句,但找不到有用的示例。我不明白为什么 Pinal Dave 使用Inserted.ID, Inserted.TEXTVal, Deleted.ID, Deleted.TEXTVal而不是Updated.TextVal. 更新被认为是插入还是删除?

我发现这篇文章TSQL: UPDATE with INSERT INTO SELECT FROM说“AFAIK,你不能用一条 sql 语句更新两个不同的表。”

是否有一个干净的单一声明来做到这一点?我正在寻找一个正确的、可维护的 SQL 语句。我必须在一个事务中包装两个语句吗?

4

1 回答 1

8

OUTPUT只要LittleTable满足成为目标的条件,就可以使用该子句OUTPUT ... INTO

UPDATE BigTable
SET ExportedFlag = 'T'
OUTPUT inserted.Col1, inserted.Col2 INTO LittleTable(Col1,Col2)
WHERE <some_criteria>

使用INSERTEDor没有区别DELETED。唯一不同的列是您正在更新的列(deleted.ExportedFlag具有之前的值并且inserted.ExportedFlag将是T

于 2012-09-13T13:42:46.943 回答