针对批处理插入操作,有时其中的个别操作会发生失败的情况。倘若再次执行可能会使之前已经插入成功的数据再次插入,从而造成数据重复。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。
?