SQL Server 2008 中的 MERGE 语句
Microsoft SQL Server 2008 新特性:MERGE 语句
引言
SQL Server 2008 的一个非常棒的新特性是 MERGE 语句。使用单个语句,我们可以在数据库表中添加/更新记录,而无需显式检查记录是否存在以执行插入或更新等操作。
关于 MERGE 语句的事实
在开始使用 MERGE 语句之前,您需要了解以下几点:
- 一个原子语句,结合了
INSERT
、UPDATE
和DELETE
操作,基于条件逻辑。 - 作为一个基于集合的操作执行,比多个单独的操作更有效。
MERGE
由 ANSI SQL 定义;您也会在其他数据库平台中找到它。- 在 OLTP 和数据仓库环境中都很有用。
OLTP:合并来自外部源的最新信息。
DW:事实表和缓慢变化维度的增量更新。
典型的 MERGE 语句如下所示:
MERGE [INTO] <target table>
USING <source table or table expression>
ON <join/merge predicate> (semantics similar to outer join)
WHEN MATCHED <statement to run when match found in target>
WHEN [TARGET] NOT MATCHED <statement to run when no match found in target>
示例
-- Update existing, add missing
MERGE INTO dbo.tbl_Customers AS C
USING dbo.tbl_CustomersTemp AS CT
ON C.CustID = CT.CustID
WHEN MATCHED THEN
UPDATE SET
C.CompanyName = CT.CompanyName,
C.Phone = CT.Phone
WHEN NOT MATCHED THEN
INSERT (CustID, CompanyName, Phone)
VALUES (CT.CustID, CT.CompanyName, CT.Phone)
CREATE TABLE dbo.tbl_Source (id INT, name NVARCHAR(100), qty INT);
CREATE TABLE dbo.tbl_Target (id INT, name NVARCHAR(100), qty INT);
--Synchronize source data with target
MERGE INTO dbo.tbl_Target AS t
USING dbo.tbl_Source AS s
ON t.id = s.id
WHEN MATCHED AND (t.name != s.name OR t.qty!= s.qty) THEN
--Row exists and data is different
UPDATE SET t.name = s.name, t.qty = s.qty
WHEN NOT MATCHED THEN
--Row exists in source but not in target
INSERT VALUES (s.id, s.name, s.qty)
WHEN SOURCE NOT MATCHED THEN
--Row exists in target but not in source
DELETE OUTPUT$action, inserted.id, deleted.id
结论
因此,有了这个新特性,我们可以使用单个语句实现添加/插入/删除功能,而无需遍历记录进行检查。
希望您喜欢这篇文章。祝您编程愉快!!!
历史
- 2009 年 6 月 11 日:初始发布