3

私の質問は、単一の更新ステートメントでの更新の順序に関係しています。SELECTステートメントを使用して変数を設定すると、変数が順番に設定されることがわかりました。例えば:

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

設定操作が順番に行われるため、この時点で@Test1になります。しかし、どうなりますか?2@Test23UPDATE

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

1 に答える 1

5

割り当ての右側の名前は、列の順序に関係なく、列の古い値を参照しています。

これにより (たとえば)、一時変数を使用せずに 2 つの値を交換できます。

UPDATE foo
SET a = b,
    b = a

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


SQL-92 仕様 (セクション 13.10、一般規則、395 ページの項目 6) には、次のように記載されています。

  • s は、<value expression>T の行を更新する前に、T の行ごとに効果的に評価されます。
于 2012-05-01T19:15:03.497 に答える