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 操作。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据
, 语句
, update
, 同步
, target
, source
, 同步表数据
merge语句
sql server merge语句、sqlserver merge语句、merge语句、mysql merge语句、sql server merge,以便于您获取更多的相关知识。

时间: 2024-07-31 03:43:06

SQL Server中使用 Merge 语句实现表数据之间的对比同步的相关文章

SQL Server中的Merge关键字

原文:SQL Server中的Merge关键字 简介     Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:"根据与源表联接的结果,对目标表执行插入.更新或删除操作.例如,根据在另一个表中找到的差异在一个表中插入.更新或删除行,可以对两个表进行同步.",通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的.     可以想象

如何从SQL SERVER中恢复被删除的表?

问题描述 如何从SQL SERVER中恢复被删除的表?这表中的数据能不能一起恢复? 解决方案 恢复被删除的表可以使用SQL数据恢复软件log explorer for sql server来恢复,表中的数据可以一起恢复.具体的可以看一下这篇.http://www.wuguoqiang.com/j_note_detail.asp?id=24解决方案二:删表之前最后先备份下"create table temp as(select * from tableName)"

简介SQL Server中的Merge关键字

简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:"根据与源表联接的结果,对目标表执行插入.更新或删除操作.例如,根据在另一个表中找到的差异在一个表中插入.更新或删除行,可以对两个表进行同步.",通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的. 可以想象出,需要使用Merge的场景比如: 数据同步 数据转换 基于源表

基于SQL Server中如何比较两个表的各组数据 图解说明_MsSql

开始 前一阵子,在项目中碰到这样一个SQL查询需求,有两个相同结构的表(table_left & table_right),如下: 图1. 检查表table_left的各组(groupId),是否在表table_right中存在有一组(groupId)数据(data)与它的数据(data)完全相等. 如图1. 可以看出表table_left和table_right存在两组数据完整相等: 图2. 分析 从上面的两个表,可以知道它们存放的是一组一组的数据:那么,接下来我借助数学集合的列举法和运算进行

SQL Server中如何比较两个表的各组数据方法总结

 代码如下 复制代码 use tempdb go if object_id('table_left') is not null drop table table_left if object_id('table_right') is not null drop table table_right go create table table_left(groupId nvarchar(5),dataSub1 nvarchar(10),dataSub2 nvarchar(10)) create ta

Sql Server中一次更新多列数据

  UPATE yourTableName SET column1 = xx, column2 = yy , column3 = zz WHERE yourCondition 举个例子,比如有这样一张表: 表名:StudentInfo UPATE StudentInfo SET Name = 'Small Bob', Age = 19 WHERE Number = 's1' 注意:单引号和都要是英文状态下的标点符号

SQL Server教程:三种导入导出数据使用方式比较

  在我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新建的数据库中时,尤其是在进行数据检验.净化和转换时,将会面临很大的挑战.幸好SQL Server为我们提供了强大.丰富的数据导入导出功能,并且在导入导出的同时可以对数据进行灵活的处理. 在SQL Server中主要有三种方式导入导出数据:使用Transact-SQL对数据进行处理;调用命令行工具BCP处理数据;使用数据转换服务(DTS)对数据进行处理.这三种方法各有其特点,下面就它们的主要特点进行比较. 一.使用方式

sql语句-SQL SERVER中怎么把两次SELECT的结果集放到一个表的不同列?

问题描述 SQL SERVER中怎么把两次SELECT的结果集放到一个表的不同列? SELECT MY_SIGN_IN_TIME,MY_SIGN_OUT_TIME,NAME AS SIGNNAME From SIGN_RECORD INNER JOIN JOBSKYER ON SIGN_RECORD.JOBSKYER_ID=JOBSKYER.JOBSKYER_ID SELECT NAME AS REPLACENAME FROM SIGN_RECORD INNER JOIN JOBSKYER ON

如何将SQL Server中的表变成txt文件

方法-:用BCP命令 bcp 实用工具 bcp 实用工具在 Microsoft SQL Server 2000 实例和数据文件之间以用户指定的格式复数据. 语法 bcp {[[database_name.][owner].]{table_name | view_name} | "query"} {in | out | queryout | format} data_file [-m max_errors] [-f format_file] [-e err_file] [-F first