如何用其他代码替换SQL Server 2012中的MERGE语句实现同等功能
替换SQL Server 2012 MERGE查询的等效实现
原MERGE语句的核心逻辑是针对ReprocessPRESs表,对指定@PRId的记录执行以下操作:
- 插入
@ESIds用户定义类型中存在、但表中未匹配的(PRId, ESId, CreateDate)记录 - 删除表中属于该
@PRId、但不在@ESIds中的记录
可以用分开的INSERT和DELETE语句实现完全等效的功能,代码如下:
插入操作
-- 插入目标表中不存在的指定PRId对应记录 INSERT INTO ReprocessPRESs WITH (ROWLOCK) (PRId, ESId, CreateDate) SELECT @PRId AS PRId, Val AS ESId, GETDATE() AS CreateDate FROM @ESIds WHERE NOT EXISTS ( SELECT 1 FROM ReprocessPRESs WHERE PRId = @PRId AND ESId = Val );
删除操作
-- 删除目标表中存在但不在@ESIds中的指定PRId记录 DELETE FROM ReprocessPRESs WITH (ROWLOCK) WHERE PRId = @PRId AND NOT EXISTS ( SELECT 1 FROM @ESIds WHERE Val = ESId );
等效性说明
- 插入语句通过
NOT EXISTS筛选出原MERGE中WHEN NOT MATCHED BY TARGET的记录,确保仅新增未存在的条目 - 删除语句通过
NOT EXISTS匹配原MERGE中WHEN NOT MATCHED BY SOURCE的逻辑,清理不在传入集合中的旧记录 - 保留了原语句的
ROWLOCK锁提示,保证锁行为与原MERGE一致 - 分开执行的方式避免了MERGE可能存在的并发隐患(如意外更新、锁升级),逻辑更直观清晰
内容的提问来源于stack exchange,提问作者Hemant Singh Sisodia
相关产品推荐
相关产品推荐

