次の方法で共有


WAITFOR (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric プレビューの SQL データベース

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

Transact-SQL 構文表記規則

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_passhh:mm[[:ss].fff]として書式設定されます。

TIME

バッチ、ストアド プロシージャ、またはトランザクションが実行される指定した時刻。

'time_to_execute'

WAITFOR ステートメントが終了する時刻。 time_to_execute、datetime データ形式で指定することも、ローカル変数として指定することもできます。 日付を指定できないため、 datetime 値の日付部分は使用できません。 time_to_executehh: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_passtime_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.