我有一个SQL脚本,它可以作为补丁使用,因此它只打算运行一次来修改数据库中的某些条目:
INSERT INTO Table1 ...
INSERT INTO Table2 ...
etc...
如果客户服务(或者正在应用补丁的人)不小心多次运行此脚本,那么在某些表中会有重复的条目会产生不良影响。
我的想法是在每个DELETE
之前只有一个INSERT
语句,这样如果即将插入的条目已经存在,它将被删除,避免重复。如果该条目尚未存在,则DELETE
语句对数据库没有影响。
有没有更好的方法来处理这个问题,如果是这样,为什么建议的方法被认为更好或更合适?性能不是问题,因为脚本只打算运行一次。
请注意,我不会问是否存在另一种方法。我问,鉴于CONTEXT(脚本是一个只能运行一次的补丁),上面描述的解决方案是否合适,或者有理由我应该避免采用我的方法并以另一种方式解决问题?
答案 0 :(得分:1)
我会使用merge声明:
merge into [dbo].[Table] target using (
VALUES
(100001, 'Value1', NULL, 1)
,(100002, 'Value2', NULL, 1)
)
as source ([Id], [Column1], [Column2], [Column3])
on target.[Id] = source.[Id]
when matched then update set
[Column1] = source.[Column1]
,[Column2] = source.[Column2]
,[Column3] = source.[Column3]
when not matched by target then
insert ([Id], [Column1], [Column2], [Column3]) values
(source.[Id],source.[Column1],source.[Column2],source.[Column3])
;