当前位置: 代码迷 >> SQL >> sqlserver2008 Merge运用
  详细解决方案

sqlserver2008 Merge运用

热度:33   发布时间:2016-05-05 12:37:38.0
sqlserver2008 Merge应用

针对批处理插入操作,有时其中的个别操作会发生失败的情况。倘若再次执行可能会使之前已经插入成功的数据再次插入,从而造成数据重复。mysql可以使用insert ignore into解决(针对唯一索引相同时,更新相应数据)。而sqlserver2008有一个更为强大的merge可以使用。

?

merge根据目标表与源表(源表可以是一个具体的表,也可以是一个子查询语句)联结的结果,对目标表执行Insert,Update,Delete操作。

merge的语法:

?

with tb(id,code,time) as (select 1,'c1','2012-01-01' unionselect 2,'c2','2012-02-05' unionselect 3,'c1','2012-01-02' unionselect 4,'c2','2012-02-06' unionselect 5,'c1','2012-01-03' unionselect 6,'c2','2012-02-07')--MERGE 目标表 AS TGTMERGE  tb AS TGT--USING 源表 AS SRCUSING (		SELECT 'c3' AS code,'2012-01-01' AS time      ) AS SRC      ON TGT.code = SRC.code AND         TGT.time = SRC.time --对源表与目标表匹配的项执行的操作--when matched and [其它条件] thenWHEN MATCHED THEN                UPDATE SET TGT.time = 'sdaf'--对源表中存在的,而目标表中不存在的匹配项执行操作--when not matched [其它条件] thenWHEN NOT MATCHED THEN                INSERT (code,time)                    VALUES(SRC.code,SRC.time)--对目标表中存在的,而源表中不存在的匹配项执行操作--when not matched by source and [其它条件] thenWHEN NOT MATCHED BY SOURCE THEN							DELETE      --$action 返回执行结果(insert,update,delete) Inserted.列名    OUTPUT $action ,Inserted.id;

?注意:

1、结果以分号结果。

2、匹配条件根据实际情况使用,如批量插入,如果目标表没有源表的数据则insert。那么只需要使用到WHEN NOT MATCHED THEN

?

  相关解决方案