2016-04-13 11 views
3

私はのは、この文挿入前または挿入後にSQL Serverの既定値が生成されていますか?

INSERT INTO dbo.bob 
     (blah) 
VALUES (
      @blarg 
     ) 

が完了するまでに10秒かかると仮定しよう。この

CREATE TABLE bob 
    (ID INT IDENTITY, 
    blah VARBINARY(MAX), 
    ts DATETIME2 DEFAULT GETUTCDATE()) 

のように見えるテーブルを持っています。

挿入の開始時の時間がtである場合。新しく作成された行にt秒かt + 10秒かかりますか?言い換えれば、挿入の開始時または挿入の終わり(または他の何らかの規則)でデフォルトが生成されますか?

答えて

6

GETUTCDATEは、それが開始と文で挿入されたすべての行に対して全体で使用したのと同じ値で一度に計算されますruntime constant

です。

GETUTCDATEを呼び出すスカラーUDFでラップし、その代わりにUDFを呼び出すようにデフォルトを変更すると、行ごとに異なる値が表示されることがあります。

1行のステートメントでは、10秒の遅延がどこにあるかによって異なります。 10秒間プランをコンパイルできない場合は、それまで実行を開始しないので、それは時間になります。実行を開始してロックを待っている場合、ランタイム定数が既に解決されているため、待機する前に割り当てられるべきであると思います。

+1

間違っています。私は確認するために二重にチェックしました。デフォルトの制約として使用すると、すべてのinsert文でGETDATEとGETDATEUTCが再実行されます。 – Cogman

+1

@Cogmanあなたは私の答えを正しく読まなかった。それは確かに値がステートメントの間に残るという主張はしていません。私は、1つのステートメントに複数の行を挿入し、挿入ステートメントに10秒かかる場合について説明しています。 –

+1

私の間違い。あなたが正しいです :) 。私はあなたの声明を読み返し、それは理にかなっています。混乱をおかけして申し訳ありません。 – Cogman

関連する問題