表数据之间的同步有不少种实现方式,好比删除而后从新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等。包括在 SSIS Package 中也能够经过 Lookup, Condition Split 等多种 Task 的组合来实现表数据之间的同步。在这里 "同步" 的意思是指每次执行一段代码的时候可以确保 A 表的数据和 B 表的数据始终相同。app
能够经过 SQL Server 中提供的 Merge 语句来实现,而且还能够将操做的细节记录下来。具体的细节内容请参照 - http://msdn.microsoft.com/zh-cn/library/bb510625.aspx 我这里只用一个简单的示例来介绍一些它的常见功能。测试
测试表 - 一个 Source 表,一个 Target 表和一个日志记录表,用来记录每次所执行的操做。.net
下面是主要的同步操做日志
MERGE INTO - 数据的目的地,将数据最终 MERGE 到的表对象code
USING 与源表链接 ON 关联的条件对象
WHEN MATCHED - 若是匹配成功,即关联条件成功 (这时就应该将 SOURCE 中其它的全部字段值更新到 TARGET 表中)blog
WHEN NOTMATCHED BY TARGET - 若是匹配不成功 (TARGET 中没有这一条记录可是 SOURCE 表有,说明 SOURCE 表多了新数据所以应该插入到 TARGET 表中)ip
WHEN NOTMATCHED BY SOURCE - 若是匹配不成功 (SOURCE 中没有这一条记录可是 TARGET 表有,说明 SOURCE 表可能把这条数据删除了,因此 TARGET 也应该删除)get
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 语句查看一下结果,两个表的数据如出一辙了 -
ID = 1,2,3 的记录在 Source 表和Target 表都存在,所以执行的是 UPDATE 操做。
ID = 4,5 的记录在 Source 表存在,可是在 Target 表不存在,所以执行的是 INSERT 操做。
ID = 6,7 的记录在 Target 表存在,可是在 Source 表不存在,所以执行的是 DELETE 操做。
--转自https://blog.csdn.net/imJaron/article/details/79760721