合并示例 - 同步源和目标表

要说明 MERGE 声明,请考虑以下两个表 -

  1. dbo.Product :此表包含有关该公司当前销售的产品的信息

  2. dbo.ProductNew :此表包含有关该公司将来销售的产品的信息。

以下 T-SQL 将创建并填充这两个表

IF OBJECT_id(N'dbo.Product',N'U') IS NOT NULL 
DROP TABLE dbo.Product
GO

CREATE TABLE dbo.Product (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(64),
PRICE MONEY
)

IF OBJECT_id(N'dbo.ProductNew',N'U') IS NOT NULL 
DROP TABLE dbo.ProductNew
GO

CREATE TABLE dbo.ProductNew (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(64),
PRICE MONEY
)

INSERT INTO dbo.Product VALUES(1,'IPod',300)
,(2,'IPhone',400)
,(3,'ChromeCast',100)
,(4,'raspberry pi',50)

INSERT INTO dbo.ProductNew VALUES(1,'Asus Notebook',300)
,(2,'Hp Notebook',400)
,(3,'Dell Notebook',100)
,(4,'raspberry pi',50)

现在,假设我们想要将 dbo.Product 目标表与 dbo.ProductNew 表同步。以下是此任务的标准:

  1. 存在于 dbo.ProductNew 源表和 dbo.Product 目标表中的产品将在 dbo.Product 目标表中使用新的新产品进行更新。

  2. dbo.Product 目标表中不存在的 dbo.ProductNew 源表中的任何产品都将插入到 dbo.Product 目标表中。

  3. 必须从 dbo.Product 目标表中删除 dbo.Product 目标表中不存在于 dbo.ProductNew 源表中的任何产品。以下是执行此任务的 MERGE 语句。

MERGE dbo.Product AS SourceTbl 
USING dbo.ProductNew AS TargetTbl ON (SourceTbl.ProductID = TargetTbl.ProductID)
WHEN MATCHED 
            AND SourceTbl.ProductName <> TargetTbl.ProductName
            OR SourceTbl.Price <> TargetTbl.Price
    THEN UPDATE SET SourceTbl.ProductName = TargetTbl.ProductName,
                SourceTbl.Price = TargetTbl.Price
WHEN NOT MATCHED 
    THEN INSERT (ProductID, ProductName, Price)
         VALUES (TargetTbl.ProductID, TargetTbl.ProductName, TargetTbl.Price)
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE
OUTPUT $action, INSERTED.*, DELETED.*;

注意:分号必须出现在 MERGE 语句的末尾。 https://i.stack.imgur.com/GULoi.jpg