1

ある列から別の列に値を移動してから、元の列に新しい値を設定する必要があるテーブルがあります。

declare @foo table (A int, B int);

insert into @Foo select 1, 0;

update @Foo
set B = A,
    A = 2;

更新後はB常に含まれているのでしょうか、1それともこの非決定論的な動作であり、2Aが最初に更新されたために値が設定されることがあります(そして、すべてのテストが適切な条件に達したことがない2)?


フォローアップの質問として、答えが「B常に1」である場合、次のことを行っても同じ結果が得られますか?

update @Foo
set A = 2,
    B = A;
4

2 に答える 2

4

B常に含まれ1、句の順序に違いはありません。概念的には、操作は「一度に」行われます。

以下はSQLでも機能し、中間変数を必要とせずに2つの値を交換します。

update @Foo
set A = B,
    B = A;
于 2012-11-19T16:56:05.357 に答える
4

を実行するupdateと、SQLServerは2つのバージョンの行を保持します。古いもの(別名deleted)と新しいもの(別名inserted。)割り当て自体はinserted行を変更するだけです。すべての割り当ては、行の同じ変数値を使用しますdeleted。割り当ての順序は重要ではありません。

outputこれは、次の句を使用して視覚化できます。

declare @t table (a int, b int)
insert @t values (1,2), (2,3)

update @t 
set     b=a
,       a=b
output  inserted.*
,       deleted.*

select * from @t
于 2012-11-19T17:05:11.747 に答える