【问题标题】:SQL Server MERGE statement : how does it match the destination tableSQL Server MERGE 语句:它如何匹配目标表
【发布时间】: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


【解决方案1】:

merge 语句只在语句开头计算一次连接条件。如果源表中有两行具有相同的连接条件,而目标中没有要匹配的行,则将插入这两行。它不插入一个,重新评估连接并更新另一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多