SQL Server - 使用 Merge 语句实现表数据之间的对比同步
2017-11-21 11:11
495 查看
表数据之间的同步有很多种实现方式,比如删除然后重新 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 操作。
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 操作。
![](http://images.cnitblog.com/blog/477275/201310/15151940-9c6ec4a656104898a95746addcf0830f.png)
相关文章推荐
- 【转载】SQL Server - 使用 Merge 语句实现表数据之间的对比同步
- SQL Server - 使用 Merge 语句实现表数据之间的对比同步
- SQL Server - 使用 Merge 语句实现表数据之间的对比同步
- SQL Server-使用Merge语句实现表数据之间的对比同步
- SQL Server - 使用 Merge 语句实现表数据之间的对比同步
- 使用 Merge 语句实现表数据之间的对比同步
- SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) 一条语句实现两表同步(添加、删除、修改)
- 使用SharedPreferences实现Activity和Service之间数据同步问题
- [SQL Server] 使用事务发布与订阅实现数据同步
- SQL Server 使用 Merge 关键字进行表数据同步
- sql2008使用merge语句实现数据差异传输
- 使用C#实现sql server 2005 和Oracle 数据同步
- 在sql server中,如何使用一条语句实现将表1中的数据复制到表2中
- SQL SERVER - 使用MERGE语句完成单向表同步
- 在SQL Server中sqlserver,access,excel之间数据如何使用sql语句直接操作
- 使用 Python 在 Caché 和 Sql Server 之间同步数据
- 使用 Python 在 Caché 和 Sql Server 之间同步数据
- C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序
- sql2008使用merge语句实现数据差异传输
- SQL Server 2005使用发布、订阅实现数据同步