游標(Cursor)屬逐列處理,效能差、鎖定久、程式碼冗長。現代 SQL 最佳實務強調集合式思維,以單一陳述式完成批次更新。本文展示一個典型「依條件對應更新」的游標改寫範例。
Tb_Garden1。Zyq.Tb_User 找 REPLACE(Name, '區', '') = Garden.Name 的第一筆 Id。Id 寫回 Tb_Garden1.Steward。UPDATE G
SET Steward = (
SELECT TOP 1 U.Id
FROM Zyq.Tb_User U
WHERE REPLACE(U.Name, '區', '') = G.Name
)
FROM Tb_Garden1 G
WHERE EXISTS (
SELECT 1
FROM Zyq.Tb_User U
WHERE REPLACE(U.Name, '區', '') = G.Name
);
| 技巧 | 說明 |
|---|---|
| 子查詢回傳單值 | SELECT TOP 1 ... 確保標量子查詢不會因多筆結果報錯。 |
WHERE EXISTS 過濾 | 僅更新有對應資料的列,避免將無對應列設為 NULL。 |
別名 G/U | 簡化多表參考,提升可讀性。 |
| 無游標宣告/開啟/擷取/關閉 | 單一陳述式,最佳化器可產生平行計劃、批次鎖定,效能指數級提升。 |
只要符合以下特徵,皆可嘗試改寫: