SQL Server MERGE语句是否会更新匹配条件中的super_id字段?
关于SQL Server MERGE语句并发执行是否会修改super_id的分析
结论:你提供的这段MERGE语句绝对不会修改已有记录的super_id字段,原因如下:
从语句逻辑来看:
WHEN MATCHED分支的UPDATE操作仅更新field1和field2,完全没有涉及super_id字段,匹配到现有记录时只会修改那两个字段,不会改动super_id。WHEN NOT MATCHED BY TARGET分支是插入新记录,插入的super_id来自传入的变量@SuperId,不会对已有记录做任何修改。
并发执行场景下的影响:
即使两个应用实例并发执行该语句,最多只会出现两种结果:要么其中一个实例先完成插入,另一个匹配到已存在的记录后执行更新(仅更新field1/field2);要么因为SQL Server的锁机制,其中一个实例等待另一个完成后再执行,最终结果依然不会修改已有记录的super_id。不存在并发导致super_id被篡改的可能。
建议排查方向:
- 确认表
foo上是否存在触发器(比如INSTEAD OF或AFTER触发器),这类触发器可能在MERGE执行时隐性修改super_id字段。 - 再次核对是否有未排查到的后台任务、定时作业或其他存储过程在操作该表。
- 重点排查人为手动修改的可能性。
内容的提问来源于stack exchange,提问作者Nikita Kalimov
相关产品推荐
相关产品推荐

