1. 简介
SQL Server中的MERGE函数是一种用于修改目标表数据的强大工具。它可执行合并操作,将源表中的数据合并到目标表中,同时根据匹配条件来更新、删除或插入记录。
2. 语法
MERGE 目标表 AS 目标
USING 源表
ON 匹配条件
WHEN 匹配 THEN 更新
WHEN 不匹配时 THEN 插入
WHEN NOT MATCHED BY SOURCE THEN 删除
OUTPUT 插入、更新或删除的数据 INTO 输出表;
3. 参数说明
3.1 目标表(Destination)
指要执行合并操作的目标表。
3.2 源表(Source)
指要与目标表匹配的源表。
3.3 匹配条件(ON)
指要用作匹配依据的列或表达式。
3.4 更新(WHEN MATCHED THEN)
指在源表和目标表匹配的情况下要更新的列或表达式。
3.5 插入(WHEN NOT MATCHED BY TARGET THEN)
指在源表和目标表不匹配的情况下要插入的列或表达式。
3.6 删除(WHEN NOT MATCHED BY SOURCE THEN)
指在目标表中存在但在源表中不存在的行,要执行的删除操作。
3.7 输出表(OUTPUT INTO)
指用于存储MERGE函数所操作行的输出表。
4. 示例
例如,我们有两个表,一个是目标表(Destination),一个是源表(Source),它们的结构分别如下:
CREATE TABLE Destination
(
Id INT PRIMARY KEY,
Name VARCHAR(50),
Age INT
);
CREATE TABLE Source
(
Id INT PRIMARY KEY,
Name VARCHAR(50),
Age INT
);
现在,我们想要将源表中的数据合并到目标表中,并按照匹配条件(Id)进行更新或插入操作。可以使用以下MERGE函数:
MERGE Destination AS T
USING Source AS S
ON T.Id = S.Id
WHEN MATCHED THEN
UPDATE SET T.Name = S.Name, T.Age = S.Age
WHEN NOT MATCHED BY TARGET THEN
INSERT (Id, Name, Age) VALUES (S.Id, S.Name, S.Age)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
OUTPUT $action, inserted.*, deleted.* INTO OutputTable;
此代码将执行以下操作:
将目标表作为表别名“T”传入MERGE函数中。
将源表作为表别名“S”传入MERGE函数中。
指定匹配条件为两个表的Id列。
在匹配的情况下,根据源表的Name和Age列更新目标表的Name和Age列。
在目标表中不存在源表中的行(即不匹配)时,在目标表中插入源表的Id、Name和Age列。
在源表中不存在目标表中的行时,在目标表删除源表中的行。
将修改的数据以及插入、删除的行输出到OutputTable中。
然后,我们可以对OutputTable进行查询,以查看执行MERGE函数后的结果:
SELECT * FROM OutputTable;
这将返回MERGE函数的执行结果,其中包括以下列:
Action:指执行的操作,可能是UPDATE、INSERT或DELETE。
Id:指在目标表和源表之间匹配的Id列。
Name:指在目标表和源表之间匹配的Name列。
Age:指在目标表和源表之间匹配的Age列。
Id:指插入行的Id值。
Name:指插入行的Name值。
Age:指插入行的Age值。
5. 总结
在本文中,我们了解了SQL Server中MERGE函数的用法。这个功能强大的函数可用于将源表中的数据合并到目标表中,并根据匹配条件来更新、删除或插入记录。无论是需要将大量数据导入到数据库、更新数据库中的数据还是保持常规数据更新,MERGE函数都是非常有用的工具。