MERGE 語法是 SQL Server 2008 引入的強大功能,它將插入、更新、刪除三種操作整合在單一陳述式中。根據來源表與目標表的聯接結果,MERGE 可以同步兩張表的資料:當符合條件時更新,不符合時插入,來源表中不存在的目標資料則刪除。這對於資料倉儲的 ETL 流程、資料同步等場景極為實用。
MERGE 目標表 AS 目標別名
USING 來源表 AS 來源別名
ON 聯接條件
WHEN MATCHED THEN UPDATE SET 目標欄位 = 來源欄位
WHEN NOT MATCHED THEN INSERT (欄位列表) VALUES (來源欄位列表)
WHEN NOT MATCHED BY SOURCE THEN DELETE;
以下範例示範如何使用 MERGE 將 Orders2 的變更同步到 Orders 表:
USE tempdb;
GO
-- 建立目標訂單表
CREATE TABLE Orders (OrderID INT, CustomerID NCHAR(5));
GO
-- 插入初始資料
INSERT INTO Orders VALUES (1, N'AAAAA');
INSERT INTO Orders VALUES (2, N'BBBBB');
GO
-- 建立來源表(僅複製 OrderID=1 的資料)
SELECT * INTO Orders2 FROM Orders WHERE OrderID = 1;
GO
-- 修改來源表資料
UPDATE Orders2 SET CustomerID = N'DDDDD';
-- 執行 MERGE 同步
MERGE Orders o
USING Orders2 o2 ON o2.OrderID = o.OrderID
WHEN MATCHED THEN UPDATE SET o.CustomerID = o2.CustomerID
WHEN NOT MATCHED THEN INSERT VALUES (o2.OrderID, o2.CustomerID)
WHEN NOT MATCHED BY SOURCE THEN DELETE;
執行後,Orders 表將反映 Orders2 的最新狀態:OrderID=1 的客戶代碼更新為 DDDDD,OrderID=2 因來源表無對應資料而被刪除。
OUTPUT 子句可記錄變更明細,方便稽核。MERGE 是現代化 T-SQL 開發的利器,善用它能大幅簡化資料同步邏輯。