SQL Server UPDATE 的 SET 子句執行機制:
DECLARE @i INT = 1, @j INT = 0;
DECLARE @T TABLE (Id1 INT, Id2 INT);
INSERT @T VALUES (1,10),(2,20),(3,30);
-- 語句 A
UPDATE @T SET Id1 = @i, Id2 = Id1, @i = @i + 1;
-- 結果:Id1=2,3,4 ; Id2=1,2,3 (Id2 讀取舊 Id1)
-- 語句 B
UPDATE @T SET Id1 = @i, Id2 = @j, @j = @i + 10, @i = @i + 1;
-- 結果:Id1=2,3,4 ; Id2=11,12,13 (@j 讀取舊 @i,寫入後 @j 更新供後用)
DECLARE @i INT = 1, @j INT = 0;
DECLARE @T TABLE (Id1 INT, Id2 INT);
INSERT @T VALUES (1,10);
UPDATE @T SET @j = @i, @i = @i + 1; -- @j=1, @i=2
UPDATE @T SET @i = @i + 1, @j = @i; -- @i=2, @j=2 (@j 讀取已更新的 @i)
UPDATE @T SET @i = @j + 1, @j = @i; -- @i=1, @j=1 (@i 讀取舊 @j=0+1,@j 讀取新 @i=1)
UPDATE @T SET @i = @j, @j = @i; -- @i=0, @j=0 (@i 讀取舊 @j=0,@j 讀取新 @i=0)
DECLARE @T TABLE (Id1 INT, Id2 INT);
INSERT @T VALUES (1,10),(2,20),(3,30);
UPDATE @T SET Id1 = Id2, Id2 = Id1;
-- 結果:Id1=10,20,30 ; Id2=1,2,3 (雙方讀取舊值,實現無臨時變量交換)
SET Col1=Col2, Col2=Col1 安全高效,無需臨時變量。SET @Seq = @Seq + 1, Col = @Seq 生成遞增序列,順序敏感。SET @a=1; UPDATE t SET a=@a, @a=@a+1; 類似但列賦值順序可能影響變量讀取(版本相關)。RETURNING 或 CTE。UPDATE ... SET col = expr RETURNING col INTO var 明確返回機制。