WAITFOR の使用

WAITFOR ステートメントを使用すると、次の条件が満たされるまで、バッチ、ストアド プロシージャ、またはトランザクションを中断できます。

  • 指定された時間が経過する。

  • 指定された時刻になる。

  • 指定した RECEIVE ステートメントにより、少なくとも 1 行が変更されるか Service Broker キューに返される。

実際の遅延時間は、指定した時間と異なる場合があり、サーバーの利用状況のレベルに依存します。WAITFOR ステートメントと関連付けられたスレッドがスケジュールされると、時間カウンターが開始します。サーバーがビジー状態の場合、スレッドが直ちにスケジュールされないことがあります。したがって、遅延時間は指定した時間より長くなる可能性があります。

WAITFOR ステートメントは次のいずれかの句を使用して指定します。

  • DELAY キーワードと、その後に WAITFOR ステートメントを完了するまでの時間を指定する time_to_pass。WAITFOR ステートメントを完了するまでの時間は最大 24 時間です。

    次の例では、DELAY キーワードを使用して、2 秒待機してから SELECT ステートメントを実行しています。

    WAITFOR DELAY '00:00:02';
    SELECT BusinessEntityID FROM AdventureWorks2008R2.HumanResources.Employee;
    
  • TIME キーワードと、その後に WAITFOR ステートメントの完了時刻を指定する time_to_execute。

    次の例では、TIME キーワードを使用して、AdventureWorks データベースのすべてのページが、正しく割り当てられて使用されているかどうかのチェックを、午後 10 時 (22:00) に実行するように指定しています。

    USE AdventureWorks2008R2;
    GO
    BEGIN
        WAITFOR TIME '22:00';
        DBCC CHECKALLOC;
    END;
    GO
    
  • 1 つ以上のメッセージを Service Broker キューから取得する RECEIVE ステートメント句。RECEIVE ステートメントと共に WAITFOR を指定すると、現在の Service Broker キューにメッセージが存在しない場合に、メッセージがキューに到着するまでステートメントが待機されます。

  • キューにメッセージが到達するまでの Service Broker の待機時間 (ミリ秒単位) を指定する timeout が続く TIMEOUT キーワード。TIMEOUT は、RECEIVE ステートメント内または GET CONVERSATION GROUP ステートメント内で指定できます。