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' union
select 2,'c2','2012-02-05' union
select 3,'c1','2012-01-02' union
select 4,'c2','2012-02-06' union
select 5,'c1','2012-01-03' union
select 6,'c2','2012-02-07'
)


--MERGE 目标表 AS TGT
MERGE  tb AS TGT
--USING 源表 AS SRC
USING (
		SELECT 'c3' AS code,'2012-01-01' AS time
      ) AS SRC
      ON TGT.code = SRC.code AND
         TGT.time = SRC.time 
--对源表与目标表匹配的项执行的操作
--when matched and [其它条件] then
WHEN MATCHED THEN
                UPDATE SET TGT.time = 'sdaf'
--对源表中存在的,而目标表中不存在的匹配项执行操作
--when not matched [其它条件] then
WHEN NOT MATCHED THEN
                INSERT (code,time)
                    VALUES(SRC.code,SRC.time)
--对目标表中存在的,而源表中不存在的匹配项执行操作
--when not matched by source and [其它条件] then
WHEN NOT MATCHED BY SOURCE THEN
							DELETE      
--$action 返回执行结果(insert,update,delete) Inserted.列名    
OUTPUT $action ,Inserted.id;

 注意:

1、结果以分号结果。

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

猜你喜欢

转载自weivs929.iteye.com/blog/1750899