gpt4 book ai didi

sql-server - 为什么更新后的 INSERTED.ID 和 DELETED.ID 都包含 MERGE 后的值?

转载 作者:行者123 更新时间:2023-12-03 21:14:44 24 4
gpt4 key购买 nike

令人惊讶的是,我无法在 Google 上找到这个问题的答案,尽管我的术语可能有误。我也没有看到关于 MDSN 的解释.

采用以下代码执行简单的MERGE:

DECLARE @tbl_1 TABLE (ID int IDENTITY(1,1), person nvarchar(20));
DECLARE @tbl_2 TABLE (ID int IDENTITY(1,1), person nvarchar(20));
INSERT INTO @tbl_1 (person) VALUES ('Bob'),('Ted'),('Brian');
INSERT INTO @tbl_2 (person) VALUES ('Bob'),('Ted'),('Peter');

MERGE INTO
@tbl_2 as tgt
USING
@tbl_1 as src
ON
(tgt.person = src.person)
WHEN MATCHED THEN
UPDATE SET tgt.person = src.person
WHEN NOT MATCHED BY TARGET THEN
INSERT (person) VALUES (src.person)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
OUTPUT
$ACTION,
DELETED.ID,
DELETED.person AS PersonOld,
INSERTED.ID,
INSERTED.person AS PersonNew;

在结果中,我看到每一行的 ID 值都针对 INSERTEDDELETED 行显示,其中 UPDATE 具有发生地点:

Post-merge

请问这是为什么?我希望 DELETED.ID 在更新后为 NULLINSERTED.ID 代表 UPSERTED 行(我过去曾使用过触发器,并假设 MERGE 会遵循相同的方法)。

最佳答案

因为您似乎知道 MERGE 是一个 UPSERT(更新 + 插入)。

现在,INSERTED 表记录了由 INSERTUPDATE 命令添加的行的信息以及 DELETED 表包含更新或删除的行的信息。

看看 MSDN documentation on how to "Use the inserted and deleted Tables" :

The inserted table stores copies of the affected rows during INSERT and UPDATE statements. During an insert or update transaction, new rows are added to both the inserted table and the trigger table. The rows in the inserted table are copies of the new rows in the trigger table.

An update transaction is similar to a delete operation followed by an insert operation; the old rows are copied to the deleted table first, and then the new rows are copied to the trigger table and to the inserted table.


更新:

我看到您对您的问题发表评论说您意识到该操作实际上是一个delsert。您可能会想为什么会这样?

想想数据是如何存储在 SQL Server 中的。它存储在 8KB 页面上,当您更新数据页面中包含的列中的信息时,整个数据页面都会被重写,因此本质上是一个delsert

对于 INSERT 也是一样,一个新行将进入数据页(并且可能会产生一个页面拆分 - 但这是另一个主题)并且整个数据页将必须重新-书面。

关于sql-server - 为什么更新后的 INSERTED.ID 和 DELETED.ID 都包含 MERGE 后的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43656343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com