找回密码
 立即注册

QQ登录

只需一步,快速开始

平底锅

高级会员

17

主题

21

帖子

1327

积分

高级会员

积分
1327

活字格认证

平底锅
高级会员   /  发表于:2010-9-26 15:32  /   查看:5252  /  回复:0
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

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部