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

SQL Server 2008 中的可组合 DML 和 MERGE 语句

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (15投票s)

2009年8月10日

CPOL

1分钟阅读

viewsIcon

35065

一个简单的例子,展示了 SQL Server 2008 中可组合 DML 的工作方式。

引言

在我的文章 SQL Server 2008 中的 MERGE 语句 中,我尝试展示了 SQL Server 2008 的新特性,即使用单个语句可以在数据库表中添加/更新记录,而无需显式检查记录是否存在以执行插入或更新等操作。

在这篇文章中,让我来解释一下可组合 DML,这是 SQL Server 2008 的另一个很酷的功能。

在开始使用可组合 DML 之前,您需要了解以下几点:

  • 在一个语句中组合多个 DML 操作。
  • 让一个语句对另一个语句影响的行进行操作。
  • SQL Server 2008 引入了 INSERT FROM DML

语法

INSERT INTO [target table]
SELECT ... 
FROM ([INSERT | UPDATE | DELETE | MERGE statement with OUTPUT clause]) AS D 
WHERE … ;

示例

在总部和分支机构都有一个客户表。通过每日结束处理,总部表会使用分支机构表的数据进行更新,以反映新的客户注册和现有客户信息的更改。这些更改(新增、编辑)会记录在审计表中。

该示例使用 MERGE 语句和可组合 DML 在总部客户表中执行更新,并同时将更新记录在审计表中。

-- Create Head Office Customer Table
CREATE TABLE tblCustomerMaster_HeadOffice(
 CustomerID INT PRIMARY KEY,
 CustomerName VARCHAR(100),
 PrimaryContact VARCHAR(100),
 ContactPhone VARCHAR(12));
 
-- Create Branch Office Customer Table
CREATE TABLE tblCustomerMaster_BranchOffice(
 CustomerID INT PRIMARY KEY,
 CustomerName VARCHAR(100),
 PrimaryContact VARCHAR(100),
 ContactPhone VARCHAR(12));
 
-- Create Audit Table
CREATE TABLE tblCustomersAudit (
 CustomerID INT,
 ChangeAction NVARCHAR(10),
 ChangeDate DATETIME DEFAULT CURRENT_TIMESTAMP,
 OldCustomerName VARCHAR(100),
 NewCustomerName VARCHAR(100),
 PRIMARY KEY(CustomerID , ChangeAction , ChangeDate ));
 
-- SQL Statement to Sync the Head Office Customers Table
-- using Brach Office Customers Table and 
-- Log into the CustomersAudit Table
INSERT INTO tblCustomersAudit(CustomerID, ChangeAction, 
            OldCustomerName, NewCustomerName) 
SELECT CustomerID, MergeAction, OldCustomerName, NewCustomerName
FROM (    

    MERGE INTO tblCustomerMaster_HeadOffice AS HOC   
        USING tblCustomerMaster_BranchOffice AS BOC        
        ON 
            HOC.CustomerID = BOC.CustomerID
    WHEN MATCHED AND HOC.CustomerName <> BOC.CustomerName
    -- Record exists, data different
    THEN                        
            UPDATE SET HOC.CustomerName = BOC.CustomerName, 
            HOC.PrimaryContact = BOC.PrimaryContact, 
            HOC.PrimaryContact = BOC.ContactPhone
    WHEN NOT MATCHED --Record in Branch Office and Not in Head Office
    THEN            
       INSERT (CustomerID, CustomerName, PrimaryContact, ContactPhone)
       VALUES (BOC.CustomerID, BOC.CustomerName, 
               BOC.PrimaryContact, BOC.ContactPhone)

    OUTPUT $action, 
        COALESCE(inserted.CustomerID, deleted.CustomerID),
        deleted.CustomerName, 
        inserted.CustomerName
 ) AS T(MergeAction, CustomerID, OldCustomerName, NewCustomerName)

结论

我尝试展示了可组合 DML 与 MERGE 语句结合使用时的效果。这非常简单易于实现。

希望您喜欢这篇文章。祝您编程愉快!!!

© . All rights reserved.