WAITFOR (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

指定された時間または期間が経過するか、指定されたステートメントによって少なくとも 1 つの行が変更または返されるまで、バッチ、ストアド プロシージャ、またはトランザクションの実行をブロックします。

Transact-SQL 構文表記規則

構文

  
WAITFOR   
{  
    DELAY 'time_to_pass'   
  | TIME 'time_to_execute'   
  | [ ( receive_statement ) | ( get_conversation_group_statement ) ]   
    [ , TIMEOUT timeout ]  
}  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

DELAY
バッチ、ストアド プロシージャ、またはトランザクションを実行する前に経過する必要のある、最大 24 時間までの指定された時間です。

'time_to_pass'
待機する時間の長さです。 time_to_pass は、datetime データ形式で、またはローカル変数として、指定できます。 日付を指定することはできないため、datetime 値の日付の部分は許可されません。 time_to_pass は、hh:mm[[:ss].mss] として書式設定されます。

TIME
バッチ、ストアド プロシージャ、またはトランザクションを実行するように指定された時間です。

'time_to_execute'
WAITFOR ステートメントが終了する時間です。 time_to_execute は、datetime データ形式で、またはローカル変数として指定できます。 日付を指定することはできないため、datetime 値の日付の部分は許可されません。 time_to_execute は hh:mm[[:ss].mss] で書式設定され、必要に応じて、1900-01-01 の日付を含めることができます。

receive_statement
有効な RECEIVE ステートメントです。

重要

receive_statement が指定された WAITFOR は、Service Broker メッセージに対してのみ適用できます。 詳細については、「RECEIVE (Transact-SQL)」を参照してください。

get_conversation_group_statement
有効な GET CONVERSATION GROUP ステートメントです。

重要

get_conversation_group_statement が指定された WAITFOR は、Service Broker メッセージに対してのみ適用できます。 詳細については、「GET CONVERSATION GROUP (Transact-SQL)」を参照してください。

TIMEOUT timeout
キューでメッセージの到着を待機する時間を、ミリ秒単位で指定します。

重要

TIMEOUT が指定された WAITFOR は、Service Broker メッセージに対してのみ適用できます。 詳細については、「RECEIVE (Transact-SQL)」および「GET CONVERSATION GROUP (Transact-SQL)」を参照してください。

注釈

WAITFOR ステートメントを実行している間は、トランザクションが実行され、その他のリクエストは同じトランザクションの下で実行することはできません。

実際の遅延時間は time_to_passtime_to_execute または timeout で指定される時間によって異なり、サーバーの利用状況レベルにも依存します。 時間のカウンターは、WAITFOR ステートメント スレッドがスケジュールされた時点から開始します。 サーバーがビジーの場合、スレッドはすぐにスケジュールされない場合があるので、遅延時間は指定した時間よりも長くなることがあります。

WAITFOR はクエリのセマンティクスを変更しません。 クエリが行を返すことができない場合、WAITFOR は待機状態のままか、TIMEOUT が指定されている場合は TIMEOUT に達するまで待機します。

WAITFOR ステートメントでは、カーソルをオープンすることはできません。

WAITFOR ステートメントでは、ビューを定義することはできません。

クエリが query wait オプションの値を超えると、WAITFOR ステートメントの引数を実行せずに完了できます。 構成オプションの詳細については、「query wait サーバー構成オプションの構成」を参照してください。 アクティブな待機中の処理を表示するには、sp_who を使用します。

各 WAITFOR ステートメントには、それに関連付けられたスレッドがあります。 同じサーバーに多くの WAITFOR ステートメントが指定されている場合、これらのステートメントの実行を待機することを中止できます。 SQL Server では、WAITFOR ステートメント スレッドの数が監視され、サーバーでスレッドが不足し始めると、これらのスレッドの一部がランダムに選択されて終了されます。

WAITFOR ステートメントによってアクセスされている行セットの変更を禁止するロックも保持しているトランザクション内で、WAITFOR を含むクエリを実行すると、デッドロックが発生する可能性があります。 SQL Server では、これらのシナリオを識別し、このようなデッドロックの機会が存在する場合は、空の結果セットを返します。

注意事項

WAITFOR を使用すると、SQL Server プロセスの完了が遅くなり、その結果、アプリケーションでタイムアウト メッセージが表示される可能性があります。 必要に応じて、アプリケーション レベルで接続のタイムアウト設定を調整してください。

A. WAITFOR TIME を使用する

次の例では、午後 10 時 20 分 (22:20) に msdb データベースでストアド プロシージャ sp_update_job を実行します。

EXECUTE sp_add_job @job_name = 'TestJob';  
BEGIN  
    WAITFOR TIME '22:20';  
    EXECUTE sp_update_job @job_name = 'TestJob',  
        @new_name = 'UpdatedJob';  
END;  
GO  

B. WAITFOR DELAY を使用する

次の例では、ストアド プロシージャを 2 時間遅延して実行します。

BEGIN  
    WAITFOR DELAY '02:00';  
    EXECUTE sp_helpdb;  
END;  
GO  

C. ローカル変数と共に WAITFOR DELAY を使用する

次の例では、WAITFOR DELAY オプションでローカル変数を使用する方法を示します。 このストアド プロシージャは、可変の時間だけ待機してから、経過した時間数、分数、秒数に関する情報をユーザーに返します。

IF OBJECT_ID('dbo.TimeDelay_hh_mm_ss','P') IS NOT NULL  
    DROP PROCEDURE dbo.TimeDelay_hh_mm_ss;  
GO  
CREATE PROCEDURE dbo.TimeDelay_hh_mm_ss   
    (  
    @DelayLength char(8)= '00:00:00'  
    )  
AS  
DECLARE @ReturnInfo VARCHAR(255)  
IF ISDATE('2000-01-01 ' + @DelayLength + '.000') = 0  
    BEGIN  
        SELECT @ReturnInfo = 'Invalid time ' + @DelayLength   
        + ',hh:mm:ss, submitted.';  
        -- This PRINT statement is for testing, not use in production.  
        PRINT @ReturnInfo   
        RETURN(1)  
    END  
BEGIN  
    WAITFOR DELAY @DelayLength  
    SELECT @ReturnInfo = 'A total time of ' + @DelayLength + ',   
        hh:mm:ss, has elapsed! Your time is up.'  
    -- This PRINT statement is for testing, not use in production.  
    PRINT @ReturnInfo;  
END;  
GO  
/* This statement executes the dbo.TimeDelay_hh_mm_ss procedure. */  
EXEC TimeDelay_hh_mm_ss '00:00:10';  
GO  

結果セットは次のようになります。

A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.

参照

フロー制御言語 (Transact-SQL)
datetime (Transact-SQL)
sp_who (Transact-SQL)