合併示例 - 同步源和目標表

要說明 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