Chinaunix首页 | 论坛 | 博客
  • 博客访问: 410933
  • 博文数量: 155
  • 博客积分: 2590
  • 博客等级: 少校
  • 技术积分: 2161
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-25 09:33
文章分类

全部博文(155)

文章存档

2015年(1)

2014年(2)

2013年(55)

2012年(97)

分类: 数据库开发技术

2012-12-20 13:43:29

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

 

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

merge的语法:

 

Sql代码 : 
  1. with tb(id,code,timeas (  
  2. select 1,'c1','2012-01-01' union  
  3. select 2,'c2','2012-02-05' union  
  4. select 3,'c1','2012-01-02' union  
  5. select 4,'c2','2012-02-06' union  
  6. select 5,'c1','2012-01-03' union  
  7. select 6,'c2','2012-02-07'  
  8. )  
  9.   
  10.   
  11. --MERGE 目标表 AS TGT  
  12. MERGE  tb AS TGT  
  13. --USING 源表 AS SRC  
  14. USING (  
  15.         SELECT 'c3' AS code,'2012-01-01' AS time  
  16.       ) AS SRC  
  17.       ON TGT.code = SRC.code AND  
  18.          TGT.time = SRC.time   
  19. --对源表与目标表匹配的项执行的操作  
  20. --when matched and [其它条件] then  
  21. WHEN MATCHED THEN  
  22.                 UPDATE SET TGT.time = 'sdaf'  
  23. --对源表中存在的,而目标表中不存在的匹配项执行操作  
  24. --when not matched [其它条件] then  
  25. WHEN NOT MATCHED THEN  
  26.                 INSERT (code,time)  
  27.                     VALUES(SRC.code,SRC.time)  
  28. --对目标表中存在的,而源表中不存在的匹配项执行操作  
  29. --when not matched by source and [其它条件] then  
  30. WHEN NOT MATCHED BY SOURCE THEN  
  31.                             DELETE        
  32. --$action 返回执行结果(insert,update,delete) Inserted.列名      
  33. OUTPUT $action ,Inserted.id;  

 注意:

1、结果以分号结果。

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

原文:

阅读(867) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~