SQL 2012 Merge 同步数据转换测试

简介

    Merge关键字是DML关键字。在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。

需要使用Merge的场景比如:

  •     数据同步
  •     数据转换
  •     基于源表对目标表做Insert,Update,Delete操作

测试实验

   1.SourceTable

use testdb01
go

CREATE TABLE SourceTable
(id INT,[desc] varchar(50))

insert into dbo.SourceTable(id,[desc]) values(1,'描述1');
insert into dbo.SourceTable(id,[desc]) values(2,'描述2');
insert into dbo.SourceTable(id,[desc]) values(3,'描述3');
insert into dbo.SourceTable(id,[desc]) values(4,'描述4');
--insert into dbo.SourceTable(id,[desc]) values(5,'NEW描述5');
--insert into dbo.SourceTable(id,[desc]) values(6,'NEW描述6');
--insert into dbo.SourceTable(id,[desc]) values(7,'NEW2描述5');
--insert into dbo.SourceTable(id,[desc]) values(8,'NEW2描述6');
select * from [dbo].[SourceTable]
2. TargetTable
 
use Workplan
go
/*目标库存*/
CREATE TABLE TargetTable
(id INT,[desc] varchar(50))

select * from dbo.TargetTable
insert into dbo.TargetTable(id,[desc]) values(1,'表1存在,在将被更新');
insert into dbo.TargetTable(id,[desc]) values(2,'表1存在,在将被更新');
insert into dbo.TargetTable(id,[desc]) values(5,'表1不存在,在将被更新');
insert into dbo.TargetTable(id,[desc]) values(7,'表1不存在,在将被更新');
-- truncate table TargetTable;
select * from TargetTable
3. 库数据同步测试
--1.跨库数据表同步及效验

merge into TargetTable as T
  using [testdb01].[dbo].[SourceTable] as S
  ON T.id=S.id
WHEN MATCHED               --当上面的ON后的 T.id=S.id 时,目标表中的1.2数据被更新
  THEN UPDATE SET T.[DESC]=S.[desc]
WHEN NOT MATCHED           --目标表中没有的id,在原表中有,侧插入数据
  THEN INSERT VALUES(S.id,S.[desc])
WHEN NOT MATCHED BY SOURCE  --目标表中存在id,在原表中没有,侧插删除数据
  THEN DELETE;

--2.Merge语句还有一个强大的功能是通过OUTPUT子句

merge into TargetTable as T
using [testdb01].[dbo].[SourceTable] as S
ON T.id=S.id
WHEN MATCHED               --当上面的ON后的 T.id=S.id 时,目标表中的1.2数据被更新
THEN UPDATE SET T.[DESC]=S.[desc]
WHEN NOT MATCHED           --目标表中没有的id,在原表中有,侧插入数据
THEN INSERT VALUES(S.id,S.[desc])
WHEN NOT MATCHED BY SOURCE  --目标表中存在id,在原表中没有,侧插删除数据
THEN DELETE
OUTPUT $ACTION AS [ACTION],
 Inserted.id AS 插入的id,
 Inserted.[desc] as 插入的DESC,
 Deleted.id as 删除的id,
 Deleted.[DESC] AS 删除的DESC;

 --3.Merge语句基础上加上AND附加上额外的限制条件

merge into TargetTable as T
using [testdb01].[dbo].[SourceTable] as S
ON T.id=S.id
WHEN MATCHED               --当上面的ON后的 T.id=S.id 时,目标表中的1.2数据被更新
 THEN UPDATE SET T.[DESC]=S.[desc]
WHEN NOT MATCHED and S.id=3  --目标表中没有的id=3,在原表中有,侧插入数据
 THEN INSERT VALUES(S.id,S.[desc])
WHEN NOT MATCHED BY SOURCE  --目标表中存在id,在原表中没有,侧插删除数据
 THEN DELETE
OUTPUT $ACTION AS [ACTION],
 Inserted.id AS 插入的id,
 Inserted.[desc] as 插入的DESC,
 Deleted.id as 删除的id,
 Deleted.[DESC] AS 删除的DESC;



你可能感兴趣的:(SQLServer管理开发)