3

我的问题与单个更新语句中的更新顺序有关。我观察到,当我使用SELECT语句设置变量时,变量是按顺序设置的。例如:

SELECT
    @Test1 = 2,
    @Test2 = @Test1 + 1

此时@Test1将是2并且@Test2将是3因为集合操作是按顺序完成的。但是会发生什么UPDATE

UPDATE TestTable SET
    Test1 = 2,
    Test2 = Test1 + 1

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
    ;
4

1 回答 1

5

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

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

UPDATE foo
SET a = b,
    b = a

http://sqlfiddle.com/#!3/f6984/1


SQL-92 规范(第 13.10 节,一般规则,第 6 项,第 395 页)指出:

  • 在更新 T的<value expression>任何行之前,对 T 的每一行有效地评估 s。
于 2012-05-01T19:15:03.497 回答