基于另一个更新的列更新列

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)

Mar*_*ers 5

赋值右侧的名称指的是列的旧值,无论它们的顺序如何。

这(例如)允许您在不使用临时变量的情况下交换两个值。

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的任何行之前

  • 我在 [SQL-92 规范](http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt) 中找到了它。这是第 395 页上的第 13.10 节,一般规则,第 6 项。 (3认同)