您的位置:首页 > 数据库

SQL 2012 Merge 同步数据转换测试

2018-01-19 16:01 176 查看

简介

    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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: