2012-07-25 12 views
5

次の文では、f1は常にf2の値を取得しますか?または、f2が時々最初に更新され、f1NULLとなる場合がありますか?私は、レコードを処理している間に新しい値が利用できないという印象を受けていますが、f2は古い値を持っていますが、これを言う権威ある場所を見つけることはできません。同じレコードの値を使用したSQLの更新

UPDATE x 
SET 
    x.f1 = x.f2, 
    x.f2 = NULL 

答えて

3

概念的操作が"all at once"起こるので、それが使用されます "前" の値実際

UPDATE x 
SET 
x.f1 = x.f2, 
x.f2 = x.f1 

は、2つの列の値を交換する正常に動作します。

+0

ありがとう! 「一度に」という言葉は、私が調べて読むのに必要な言葉/概念でした。乾杯。 –

2

f1常にUPDATEf2の前の値を取得します。

技術的に言えば、レコードは削除され、再度挿入されます。したがって、SQLは新しいレコードが何であるべきかを確認し、現在のレコードを削除し、その後新しいレコードを挿入します。

説明するのに役立つかもしれSQLトリガーに関するこの記事:DELETEとUPDATEステートメントの中に、影響を受けた行の

削除されたテーブルにコピーします。 DELETEまたはUPDATEステートメントの実行中、行はトリガー表から削除され、削除された表に転送されます。削除されたテーブルとトリガテーブルには、通常、共通の行がありません。

挿入されたテーブルには、INSERT とUPDATEステートメントの間に影響を受けた行のコピーが格納されます。挿入トランザクションまたは更新トランザクション中に、新規の 行が、挿入されたテーブルとトリガーテーブルの両方に追加されます。挿入されたテーブルの 行は、トリガー テーブル内の新しい行のコピーです。

http://msdn.microsoft.com/en-us/library/ms191300.aspx

+0

「技術的に言えば」レコードが削除され、再度挿入されたとはどういう意味ですか? SQL Serverは、場所の更新を行うことができます。そしてTBH私は単にここでトリガーの妥当性を見ていない。 –

+0

@MartinSmith引用文をご覧ください。私は印象の下にあったUPDATEレコードが削除され、挿入されている? – Curt

+0

場合によっては、たとえば、クラスタ化インデックスキー列が更新され、行が移動する必要がある場合などです。 –

関連する問題