Merge语法是对表进行Insert, Update, Delete这三个操作的合并成一个语句。
根据与Source Table联接的结果,对Target Table执行Insert, Update, delete的操作。
Merge的五个关键语法:
MERGE <--用于指定作为Insert, Update, delete操作的目标Table / View
USING <--用于指定要与目标联接的数据源
ON <--用于指定Target和Source的关联条件
WHEN <--根据ON子句的结果指定要执行的操作(Insert, Update, Delete)
OUTPUT <--针对Insert, Update, delete的目标对象中的每一行返回一行
参看下边的结果:
Use AdventureWorks
GO
--------------------Step1: Source Table
IF OBJECT_ID('Source_TableA') IS NOT NULL
DROP TABLE Source_TableA
GO
CREATE TABLE Source_TableA(
ID int not null primary key,
NameA nvarchar(32) not null
)
GO
INSERT INTO Source_TableA VALUES (1,N'NameA-001'),(2,N'NameA-002'),(3,N'NameA-003'),(100,N'NameA-100'),(101,N'NameA-101');
GO
--------------------Step2: Target Table
IF OBJECT_ID('Target_TableB') IS NOT NULL
DROP Table Target_TableB
GO
CREATE TABLE Target_TableB(
ID int not null primary key,
NameB nvarchar(32) not null,
AddressB nvarchar(128) null
)
GO
INSERT INTO Target_TableB VALUES (1,N'NameB-001',N'AddressB-001'),(2,N'NameB-002',N'AddressB-002'),(3,N'NameB-003',N'AddressB-003'),
(4,N'NameB-004',N'AddressB-004'),(5,N'NameB-005',N'AddressB-005');
GO
--------------------Step3: Check Source & Target Table
SELECT * FROM Source_TableA
SELECT * FROM Target_TableB
GO
--------------------Step4: Merge
MERGE Source_TableA <--要处理的对象表
USING Target_TableB <--参照的表
ON Source_TableA.ID = Target_TableB.ID <--关联的条件
WHEN NOT MATCHED THEN Insert values(Target_TableB.ID, Target_TableB.NameB) <--如果要处理的对象表没有参照表上的数据,就Insert
WHEN MATCHED THEN Update set Source_TableA.NameA = Target_TableB.NameB <--如果记录匹配,就Update
WHEN NOT MATCHED BY SOURCE THEN Delete <--如果处理的对象表数据在参照表上不存在,则Delete
OUTPUT $action, Inserted.*, Deleted.*; <--输出以上表的操作记录
----------------------------------------------------------------
$action ID NameA ID NameA
----------------------------------------------------------------
UPDATE 1 NameB-001 1 NameA-001
UPDATE 2 NameB-002 2 NameA-002
UPDATE 3 NameB-003 3 NameA-003
INSERT 4 NameB-004 NULL NULL
INSERT 5 NameB-005 NULL NULL
DELETE NULL NULL 100 NameA-100
DELETE NULL NULL 101 NameA-101
----------------------------------------------------------------
(7 row(s) affected)
SELECT * FROM Source_TableA
----------------------------------------------------------------
ID NameA
----------------------------------------------------------------
1 NameB-001
2 NameB-002
3 NameB-003
4 NameB-004
5 NameB-005
GO |
|