Sch*_*lls 3 t-sql sql-server sql-server-2008
我的问题与单个更新语句中的更新顺序有关。我观察到,当我使用SELECT语句设置变量时,变量是按顺序设置的。例如:
SELECT
@Test1 = 2,
@Test2 = @Test1 + 1
Run Code Online (Sandbox Code Playgroud)
此时@Test1将会2并且@Test2将会是3因为设置操作是按顺序完成的。但是会发生什么UPDATE?
UPDATE TestTable SET
Test1 = 2,
Test2 = Test1 + 1
Run Code Online (Sandbox Code Playgroud)
在计算中会Test2使用 的初始值Test1还是会使用我们刚刚设置的值?如果它是 aUPDATE内部的语句,它有什么区别MERGE吗?
MERGE INTO TestTable AS T
USING (
SELECT
Test1,
Test2
FROM SomeOtherTable
) AS S
ON S.Test1 = T.Test1
WHEN MATCHED THEN
UPDATE SET
T.Test1 = 2,
T.Test2 = T.Test1 + 1
;
Run Code Online (Sandbox Code Playgroud)
赋值右侧的名称指的是列的旧值,无论它们的顺序如何。
这(例如)允许您在不使用临时变量的情况下交换两个值。
UPDATE foo
SET a = b,
b = a
Run Code Online (Sandbox Code Playgroud)
http://sqlfiddle.com/#!3/f6984/1
SQL-92 规范(第 13.10 节,一般规则,第 395 页上的第 6 项)指出:
- 所述
<value expression>s的有效评估对于T中的每一行更新T的任何行之前