SQL Server MERGE 語法筆記
使用 MERGE,依來源與目標資料的比對結果執行新增、更新或刪除。
需要將一批來源資料同步至目標表時,分別撰寫新增、更新與刪除敘述,容易讓比對條件散落在不同位置。
SQL Server 的 MERGE 可以根據來源表與目標表的比對結果,在同一個敘述中執行 INSERT、UPDATE 或 DELETE。 1
本文整理 MERGE 的基本語法、多欄位比對、條件更新與刪除限制,並補充哪些情況適合改用個別 DML 敘述。
基本語法
MERGE INTO #tmp1 AS target
USING #tmp2 AS source
ON target.Key1 = source.Key1
WHEN MATCHED THEN
UPDATE SET
target.Name = source.Name,
target.Phone = source.Phone
WHEN NOT MATCHED BY TARGET THEN
INSERT (Key1, Name, Phone)
VALUES (source.Key1, source.Name, source.Phone);
其中:
MERGE INTO:指定要新增、更新或刪除資料的目標表。USING:指定提供資料的來源表。ON:定義來源與目標資料的比對條件。WHEN MATCHED:找到相符資料時執行更新或刪除。WHEN NOT MATCHED BY TARGET:來源資料不存在於目標表時執行新增。
使用多個欄位比對
如果資料由多個 Key 組成,可以在 ON 條件中使用 AND:
ON target.Key1 = source.Key1
AND target.Key2 = source.Key2
WHEN MATCHED 常見寫法
以下是不同使用情境,使用時應依需求選擇,不是全部同時放進同一個 MERGE。
找到資料就更新
WHEN MATCHED THEN
UPDATE SET
target.Name = source.Name,
target.Phone = source.Phone
資料內容不同時才更新
WHEN MATCHED
AND target.Name <> source.Name THEN
UPDATE SET
target.Name = source.Name,
target.Phone = source.Phone
符合條件時刪除
WHEN MATCHED
AND target.Name = ''
AND source.Name = '' THEN
DELETE
同時處理條件更新與刪除
SQL Server 允許兩個 WHEN MATCHED,但必須分別執行 UPDATE 與 DELETE:
MERGE INTO #tmp1 AS target
USING #tmp2 AS source
ON target.Key1 = source.Key1
AND target.Key2 = source.Key2
WHEN MATCHED
AND target.Name = ''
AND source.Name = '' THEN
DELETE
WHEN MATCHED
AND (
target.Name <> source.Name
OR target.Phone <> source.Phone
) THEN
UPDATE SET
target.Name = source.Name,
target.Phone = source.Phone
WHEN NOT MATCHED BY TARGET THEN
INSERT (Key1, Key2, Name, Phone)
VALUES (
source.Key1,
source.Key2,
source.Name,
source.Phone
);
語法限制
- 最多只能有兩個
WHEN MATCHED。 - 使用兩個時,一個必須是
UPDATE,另一個必須是DELETE。 - 第一個
WHEN MATCHED必須包含AND條件。 - 同一筆目標資料不能被多筆來源資料重複更新。
MERGE必須以分號;結束。 1
使用前的判斷
MERGE 適合來源與目標同時包含多種比對結果,需要在一個敘述中處理新增、更新或刪除的情境。若需求只是依另一張表更新目標資料,Microsoft 建議評估分開使用 INSERT、UPDATE 與 DELETE,可能具有更好的效能與擴充性。 1
實際使用前仍應確認來源比對鍵唯一、索引與執行計畫,並以符合正式資料量的案例驗證結果;使用 queued updating replication 時則不應使用 MERGE。 1
參考資料
-
MERGE (Transact-SQL) — Microsoft Learn ↩ ↩2 ↩3 ↩4
更新紀錄
| 日期 | 更新內容 |
|---|---|
| 2022-05-11 | 初版發布 |
| 2026-08-30 | 對齊正式文章範本,補充使用限制、適用判斷與官方文件引用 |
| 2026-08-31 | 加入自動語意詞組保護,並限制一般內文閱讀寬度 |