【问题标题】:Insert and update records in one TSQL statement?在一个 TSQL 语句中插入和更新记录?
【发布时间】:2012-09-13 13:35:59
【问题描述】:

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

有没有办法在一个语句中做到这一点?

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

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

我还查看了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 语句。我必须在一个事务中包装两个语句吗?

【问题讨论】:

  • “更新被认为是插入还是删除” - UPDATE 可以建模为 DELETEINSERT - 事实上,在内部,SQL Server 有时 i> 执行这样的转换 - 因此任何处理更新的结果(例如OUTPUTMERGEUPDATE 触发器)都对其进行建模。

标签: tsql


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多