適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric プレビューの SQL データベース
指定された時間または期間が経過するか、指定されたステートメントによって少なくとも 1 つの行が変更または返されるまで、バッチ、ストアド プロシージャ、またはトランザクションの実行をブロックします。
Syntax
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}
Arguments
DELAY
バッチ、ストアド プロシージャ、またはトランザクションの実行が進む前に、最大 24 時間を経過する必要がある指定された期間。
'time_to_pass'
待機する期間。
time_to_pass は、 datetime データ形式で指定することも、ローカル変数として指定することもできます。 日付を指定できないため、 datetime 値の日付部分は使用できません。
time_to_pass は hh:mm[[:ss].fff]
として書式設定されます。
TIME
バッチ、ストアド プロシージャ、またはトランザクションが実行される指定した時刻。
'time_to_execute'
WAITFOR ステートメントが終了する時刻。
time_to_execute は 、datetime データ形式で指定することも、ローカル変数として指定することもできます。 日付を指定できないため、 datetime 値の日付部分は使用できません。
time_to_execute は hh:mm[[:ss].fff]
形式で、必要に応じて 1900-01-01
の日付を含めることができます。
receive_statement
適用対象: Service Broker メッセージのみ。 詳細については、 RECEIVE を参照してください。
有効な RECEIVE
ステートメント。
get_conversation_group_statement
適用対象: Service Broker メッセージのみ。 詳細については、「 GET CONVERSATION GROUP」を参照してください。
有効な GET CONVERSATION GROUP
ステートメント。
TIMEOUT timeout
適用対象: Service Broker メッセージのみ。 詳細については、「 RECEIVE AND GET CONVERSATION GROUP」を参照してください。
キューでメッセージの到着を待機する時間を、ミリ秒単位で指定します。
Remarks
WAITFOR
ステートメントの実行中、トランザクションは実行中であり、同じトランザクションで他の要求を実行することはできません。
実際の遅延時間は、 time_to_pass、 time_to_execute、または タイムアウトで指定された時間とは異なる場合があり、サーバーのアクティビティ レベルによって異なります。
WAITFOR
ステートメント スレッドがスケジュールされると、タイム カウンターが開始されます。 サーバーがビジー状態の場合、スレッドがすぐにスケジュールされない可能性があるため、時間の遅延が指定された時間よりも長くなる可能性があります。
WAITFOR
では、クエリのセマンティクスは変更されません。 クエリが行を返さない場合、 WAITFOR
は永続的に待機するか、 TIMEOUT
に達するまで待機します (指定されている場合)。
WAITFOR
ステートメントでカーソルを開くことはありません。
WAITFOR
ステートメントではビューを定義できません。
クエリがクエリ待機オプションを超えると、 WAITFOR
ステートメント引数は実行せずに完了できます。 構成オプションの詳細については、「 サーバー構成: クエリ待機」を参照してください。 アクティブなプロセスと待機中のプロセスを表示するには、sp_whoを使用 します。
各 WAITFOR
ステートメントには、それに関連付けられたスレッドがあります。 同じサーバーで多数の WAITFOR
ステートメントが指定されている場合は、これらのステートメントの実行を待機している多数のスレッドを関連付けることができます。 SQL Server は、 WAITFOR
ステートメント スレッドの数を監視し、サーバーでスレッド不足が発生し始めると、これらのスレッドの一部をランダムに選択して終了します。
WAITFOR
ステートメントによってアクセスされる行セットに対する変更を防ぐロックも保持するトランザクション内でWAITFOR
クエリを実行することで、デッドロックを作成できます。 SQL Server では、これらのシナリオを識別し、このようなデッドロックの機会が存在する場合は、空の結果セットを返します。
Caution
WAITFOR
を含めると、SQL Server プロセスの完了が遅くなり、アプリケーションにタイムアウト メッセージが表示される可能性があります。 必要に応じて、アプリケーション レベルで接続のタイムアウト設定を調整してください。
Examples
A. WAITFOR TIME を使用する
次の例では、午後 10 時 20 分 (sp_update_job
) にmsdb
データベースに22:20
ストアド プロシージャを実行します。
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.