65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL Server 2008 中的 MERGE 语句

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.68/5 (19投票s)

2009年6月11日

CPOL
viewsIcon

157946

Microsoft SQL Server 2008 新特性:MERGE 语句

引言

SQL Server 2008 的一个非常棒的新特性是 MERGE 语句。使用单个语句,我们可以在数据库表中添加/更新记录,而无需显式检查记录是否存在以执行插入或更新等操作。

关于 MERGE 语句的事实

在开始使用 MERGE 语句之前,您需要了解以下几点:

  1. 一个原子语句,结合了 INSERTUPDATEDELETE 操作,基于条件逻辑。
  2. 作为一个基于集合的操作执行,比多个单独的操作更有效。
  3. MERGE 由 ANSI SQL 定义;您也会在其他数据库平台中找到它。
  4. 在 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 日:初始发布
© . All rights reserved.