# SQLServer 批量修改或插入 # 場景 今天在工作中遇到這麼一個場景,我需要根據條件對錶A做批量更新或插入。因為條件比較複雜,所以我使用了臨時表B,先把需要更新或插入的數據查詢出來放入臨時表。然後更新表A的某欄位,更新條件是A.id = B.id,更新效果是若記錄存在表A中,則更新表A的字 ...
SQLServer 批量修改或插入
場景
今天在工作中遇到這麼一個場景,我需要根據條件對錶A做批量更新或插入。因為條件比較複雜,所以我使用了臨時表B,先把需要更新或插入的數據查詢出來放入臨時表。然後更新表A的某欄位,更新條件是A.id = B.id,更新效果是若記錄存在表A中,則更新表A的欄位,若不在表A中,則插入一條記錄到表A。
初始方案
首先想到的是寫兩條SQL:
- update使用A.id in (select id from B),這時會更新所有存在的記錄的欄位,不存在則不更新
- 接下來再使用insert,條件是A.id not in (select id from B),把A不存在未更新的數據插入到A
兩條SQL執行完,則完成了所有數據的更新和插入。
優化方案
後面有朋友提示可以使用SQL Merge語句做這件事情,由於對資料庫並不熟悉,所以不知道還有這麼一個語法。我查閱了相關資料,發現Merge確實很合適這個場景。參考SQL Server Merge語句 - SQL Server教程 (yiibai.com)重構了代碼
select ... into #temp
from A where ...
merge [A] a using #B b
on a.id = b.id
when matched
then update set a.field = 1
when not matched by target
then insert (field)
values (b.id);