使用SQL Patch脚本防止多个插入

时间:2015-07-09 22:11:18

标签: sql sql-scripts

我有一个SQL脚本,它可以作为补丁使用,因此它只打算运行一次来​​修改数据库中的某些条目:

INSERT INTO Table1 ...
INSERT INTO Table2 ...
etc...

如果客户服务(或者正在应用补丁的人)不小心多次运行此脚本,那么在某些表中会有重复的条目会产生不良影响。

我的想法是在每个DELETE之前只有一个INSERT语句,这样如果即将插入的条目已经存在,它将被删除,避免重复。如果该条目尚未存在,则DELETE语句对数据库没有影响。

有没有更好的方法来处理这个问题,如果是这样,为什么建议的方法被认为更好或更合适?性能不是问题,因为脚本只打算运行一次。

请注意,我不会问是否存在另一种方法。我问,鉴于CONTEXT(脚本是一个只能运行一次的补丁),上面描述的解决方案是否合适,或者有理由我应该避免采用我的方法并以另一种方式解决问题?

1 个答案:

答案 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])
       ;