针对批处理插入操作,有时其中的个别操作会发生失败的情况。倘若再次执行可能会使之前已经插入成功的数据再次插入,从而造成数据重复。mysql可以使用insert ignore into解决(针对唯一索引相同时,更新相应数据)。而sqlserver2008有一个更为强大的merge可以使用。
merge根据目标表与源表(源表可以是一个具体的表,也可以是一个子查询语句)联结的结果,对目标表执行Insert,Update,Delete操作。
merge的语法:
Sql代码 :
- 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 tb AS TGT
-
- USING (
- SELECT 'c3' AS code,'2012-01-01' AS time
- ) AS SRC
- ON TGT.code = SRC.code AND
- TGT.time = SRC.time
-
-
- WHEN MATCHED THEN
- UPDATE SET TGT.time = 'sdaf'
-
-
- WHEN NOT MATCHED THEN
- INSERT (code,time)
- VALUES(SRC.code,SRC.time)
-
-
- WHEN NOT MATCHED BY SOURCE THEN
- DELETE
-
- OUTPUT $action ,Inserted.id;
注意:
1、结果以分号结果。
2、匹配条件根据实际情况使用,如批量插入,如果目标表没有源表的数据则insert。那么只需要使用到WHEN NOT MATCHED THEN。
原文:
阅读(919) | 评论(0) | 转发(0) |