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

时间:2012-05-01 19:13:23

标签: sql-server sql-server-2008 tsql

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

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

此时@Test1将为2@Test2将为3,因为设置操作按顺序完成。但是UPDATE会发生什么?

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

Test2会在计算中使用Test1的初始值,还是会使用我们设定的值?如果它是UPDATE内的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
    ;

1 个答案:

答案 0 :(得分:4)

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

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

UPDATE foo
SET a = b,
    b = a

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


SQL-92规范(第13.10节,第13.10节,一般规则,第6项)说明:

  
      
  • 在更新T的任何行之前,对T的每一行有效地评估<value expression>
  •