Share via


WAITFOR (Transact-SQL)

封鎖批次、預存程序或交易的執行,直到指定的時間或時間間隔到期,或直到指定的陳述式修改或傳回至少一個資料列為止。

主題連結圖示 Transact-SQL 語法慣例

語法

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

引數

  • DELAY
    這是在繼續執行批次、預存程序或交易之前,必須經過的指定時段,最多 24 小時。

  • 'time_to_pass'
    這是要等待的時間週期。 您可以用 datetime 資料所能接受的格式來指定 time_to_pass,也可以將它指定成本機變數。 不能指定日期;因此,不接受 datetime 值的日期部分。

  • TIME
    此時執行批次、預存程序或交易時的指定時間。

  • 'time_to_execute'
    這是 WAITFOR 陳述式完成的時間。 您可以用 datetime 資料所能接受的格式來指定 time_to_execute,也可以將它指定成本機變數。 不能指定日期;因此,不接受 datetime 值的日期部分。

  • 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 執行預存程序 sp_update_job。 (22:20).

USE msdb;
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

下列範例會在延遲兩小時之後執行預存程序。

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

C.搭配本機變數來使用 WAITFOR DELAY

下列範例顯示如何搭配 WAITFOR DELAY 選項來使用本機變數。 它會建立一個預存程序來等待一個可變的時段,再將經歷的時、分、秒數資訊傳回給使用者。

USE AdventureWorks2012;
GO
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)