【发布时间】:2023-03-31 01:14:01
【问题描述】:
我正在运行 SQL Server MERGE 语句来一次性加载数据。
当它执行条件语句来检查匹配时,它是否在执行合并语句之前考虑目标表?还是在插入数据后执行merge语句的过程中也考虑目标表。
假设目标表为空,匹配条件为假,并插入了一条记录。然后稍后在同一执行期间,另一个匹配相同条件的记录?它会进入更新还是插入?
Merge into tblDest dest
using tblSource as src on dest.col11 = src.col1 and dest.col2 = src.col2
When Matched then
--UPDATE
When Not Matched then
--INSERT
我已尝试执行此操作,但我的代码一直在尝试插入记录,这导致我遇到了重复键问题(但这是一个完全不同的问题)。我只是想了解合并时实际发生的情况。
【问题讨论】:
-
那么
col1是关键,col1+col2,还是别的什么? -
另外,必填:Use Caution with SQL Server's MERGE Statement。老实说,在交易中使用经过验证的真实
UPDATE / INSERT WHERE NOT EXISTS更安全/更容易。无论如何,这就是 MERGE 的所有变体为您所做的一切,除了您仍然需要自己添加事务/隔离语义。 -
col1 和 col2 是键,但我更想知道目标表在运行时处于什么状态。它看起来像一个大事务一样运行,所以当我在合并运行时查询目标表时,不存在任何记录,这让我想知道条件是否匹配。
-
你是如何查询目标表的?使用与 MERGE 语句相同的隔离级别?您期望在 MERGE 运行时看到不同的事务?一次性加载数据是否重要?
-
merge 语句用于连接源表和目标表之间的主键。 PK 是不同的,因此您不会“遇到”两次相同的 PK。
标签: sql-server