表数据之间的同步有很多种实现方式,比如删除然后重新 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. 通过Java Api与HBase交互(转)
  2. 团队项目——站立会议 DAY1
  3. 【ufldl tutorial】Convolution and Pooling
  4. loadView是干什么用的
  5. RabbitMQ挂掉问题处理
  6. Oracle merge into 使用记录
  7. 34. LotusScript中的错误处理程序
  8. 使用java写一个小白计算器
  9. Mac系统安装Aircrack-ng破解wifi密码(2)
  10. [Codeforces Round #431]简要题解
  11. [ES]elasticsearch章5 ES的分词(二)
  12. SpringBoot - 添加定时任务
  13. Markdown 绘制 UML 图 -- PlantUML + Gravizo(转)
  14. Java Dom4j XML用法总结
  15. HTML5和CSS3扁平化风格博客(进阶篇)
  16. 消息队列Kafka学习记录
  17. Python3语法详解
  18. 41-2:和为S的连续正数序列
  19. 续写上一篇的数组or指针操作
  20. resize2fs: Bad magic number in super-block while trying to open

热门文章

  1. Vue项目,运行出现warning(Emitted value instead of an instance of Error)
  2. cdlinux写入u盘启动的制作教程
  3. [Unity工具]嵌套Prefab
  4. [UGUI]图文混排(六):点击区域
  5. 【数据分析方法论】指标_DAU/MAU
  6. uva-10763-交换生
  7. git clone慢
  8. 4.安装mitmproxy问题处理
  9. C#面向对象基础2
  10. Maven环境变量