SQL Server 2008 中的可组合 DML 和 MERGE 语句
一个简单的例子,展示了 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 语句结合使用时的效果。这非常简单易于实现。
希望您喜欢这篇文章。祝您编程愉快!!!