WAITFOR (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
指定された時間または期間が経過するか、指定されたステートメントによって少なくとも 1 つの行が変更または返されるまで、バッチ、ストアド プロシージャ、またはトランザクションの実行をブロックします。
構文
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}
引数
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_pass、time_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)