原文地址:SQL Server - 使用 Merge 语句实现表数据之间的对比同步

表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等。包括在 SSIS Package 中也可以通过 Lookup, Condition Split 等多种 Task 的组合来实现表数据之间的同步。在这里 "同步" 的意思是指每次执行一段代码的时候能够确保 A 表的数据和 B 表的数据始终相同。

可以通过 SQL Server 中提供的 Merge 语句来实现,并且还可以将操作的细节记录下来。具体的细节内容请参照 - http://msdn.microsoft.com/zh-cn/library/bb510625.aspx  我这里只用一个简单的示例来介绍一些它的常见功能。

测试表 - 一个 Source 表,一个 Target 表和一个日志记录表,用来记录每次所执行的操作。

下面是主要的同步操作

MERGE INTO - 数据的目的地,将数据最终 MERGE 到的表对象

USING 与源表连接 ON 关联的条件

WHEN MATCHED - 如果匹配成功,即关联条件成功 (这时就应该将 SOURCE 中其它的所有字段值更新到 TARGET 表中)

WHEN NOTMATCHED BY TARGET - 如果匹配不成功 (TARGET 中没有这一条记录但是 SOURCE 表有,说明 SOURCE 表多了新数据因此应该插入到 TARGET 表中)

WHEN NOTMATCHED BY SOURCE - 如果匹配不成功 (SOURCE 中没有这一条记录但是 TARGET 表有,说明 SOURCE 表可能把这条数据删除了,所以 TARGET 也应该删除)

MERGE INTO @TargetTable AS T
USING @SourceTable AS S
ON T.ID = S.ID
WHEN MATCHED
THEN UPDATE SET T.DSPT = S.DSPT
WHEN NOT MATCHED BY TARGET
THEN INSERT VALUES(S.ID,S.DSPT)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
OUTPUT $ACTION AS [ACTION],
Deleted.ID AS 'Deleted ID',
Deleted.DSPT AS 'Deleted Description',
Inserted.ID AS 'Inserted ID',
Inserted.DSPT AS 'Inserted Description'
INTO @Log;

还要注意的是有一些限制条件:

  • 在 Merge Matched 操作中,只能允许执行 UPDATE 或者 DELETE 语句。
  • 在 Merge Not Matched 操作中,只允许执行 INSERT 语句。
  • 一个 Merge 语句中出现的 Matched 操作,只能出现一次 UPDATE 或者 DELETE 语句,否则就会出现下面的错误 - An action of type 'WHEN MATCHED' cannot appear more than once in a 'UPDATE' clause of a MERGE statement.
  • Merge 语句最后必须包含分号,以 ; 结束。

执行一下上面的 MERGE 语句查看一下结果,两个表的数据一模一样了 -

ID = 1,2,3 的记录在 Source 表和Target 表都存在,因此执行的是 UPDATE 操作。

ID = 4,5 的记录在 Source 表存在,但是在 Target 表不存在,因此执行的是 INSERT 操作。

ID = 6,7 的记录在 Target 表存在,但是在 Source 表不存在,因此执行的是 DELETE 操作。

最新文章

  1. jQuery学习之路(2)-DOM操作
  2. Ajax调用SpringMVC ModelAndView 无返回情况
  3. struts2拦截器interceptor的三种配置方法
  4. 【BZOJ】2802: [Poi2012]Warehouse Store(贪心)
  5. Linux下访问其他机器的共享
  6. hibernate get VS load
  7. 《Mysql 公司职员学习篇》 第二章 小A的惊喜
  8. http://www.cnbc.com/2016/07/12/tensions-in-south-china-sea-to-persist-even-after-court-ruling.html
  9. 【转】CxImage图像库的使用
  10. 快速排序算法之我见(附上C代码)
  11. 朴素贝叶斯算法简介及python代码实现分析
  12. 配置zabbix当内存剩余不足15%的时候触发报警
  13. WPF实现窗体中的悬浮按钮
  14. CAD四种坐标
  15. mongodb在windows平台安装和启动
  16. Android NDK r8 Cygwin CDT 在window下开发环境搭建 安装配置与使用 具体图文解说
  17. java写出图形界面
  18. Mesos的quorum配置引发的问题
  19. vue2.0:(四)、首页入门,组件拆分1
  20. hdu2084

热门文章

  1. JS 点击复制
  2. HBuilder后台保活开发(后台自动运行,定期记录定位数据)
  3. python导入requests库一直报错原因总结 (文件名与库名冲突)
  4. java中拼接两个对象集合
  5. 总结:Java 集合进阶精讲1
  6. Nginx、HAProxy、LVS三者的优缺点
  7. linux服务nfs与dhcp篇
  8. css3兼容性检测工具
  9. sqlserver数据库镜像运行模式
  10. Redis 主从集群搭建及哨兵模式配置