You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

幂等MERGE示例失效求助:如何实现幂等性插入处理?

如何让MERGE语句实现幂等性插入(仅支持插入操作)

问题说明

需调整MERGE语句实现幂等性插入(仅插入目标表中不存在的记录),遵循指定模板逻辑,解决当前生成重复待插入行的问题。

示例数据

create table #baseset
(
 Date varchar(30),
 ID varchar(30),
 State varchar(30),
 Count varchar(30)
)
insert into #baseset values('2/7/2023', 'A', 'A',   null)
insert into #baseset values('2/6/2023', 'A', 'A',   null)

create table #changeset
(
 Date varchar(30),
 ID varchar(30),
 State varchar(30),
 Count varchar(30)
)
insert into #changeset values('2/8/2023',   'A', 'A',   null)
insert into #changeset values('2/7/2023',   'A', 'A',   null)

当前问题

原MERGE语句的USING部分通过JOIN #baseset生成待插入行时,会因变更表单条记录与基础表多条同ID记录匹配,导致生成重复的mergeKey=null行,最终staged_updates包含5条记录,不符合预期。

调整后的MERGE语句

核心修改是在第二部分查询中添加DISTINCT去重,避免生成重复行:

MERGE INTO #baseset
USING (
  -- 尝试匹配ID,用于判断是否存在该ID的记录
  SELECT
    #changeset.ID as mergeKey, #changeset.*
  FROM
    #changeset
  UNION ALL
    -- 插入ID已存在但Date不存在的记录,设置mergeKey为NULL强制不匹配
  SELECT DISTINCT
    NULL as mergeKey,
    #changeset.*
  FROM
    #changeset
    JOIN #baseset ON #changeset.ID = #baseset.ID
  WHERE
    #changeset.Date <> #baseset.Date
) staged_updates
ON #baseset.id = mergeKey
WHEN NOT MATCHED BY TARGET THEN 
  INSERT (Date, ID, State, Count)
  VALUES (staged_updates.Date, staged_updates.ID, staged_updates.State, staged_updates.Count)
;

验证结果

调整后staged_updates的输出符合预期:

+--------+--------+---+-----+-----+
|mergeKey|    Date| ID|State|Count|
+--------+--------+---+-----+-----+
|       A|2/8/2023|  A|    A| null|
|       A|2/7/2023|  A|    A| null|
|    null|2/8/2023|  A|    A| null|
+--------+--------+---+-----+-----+

执行MERGE后,目标表仅新增2/8/2023的记录,重复执行时不会再次插入,实现幂等性。

内容的提问来源于stack exchange,提问作者John Stud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:21:35