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 陳述式上,不能定義檢視。

當查詢超出 querywait 選項時,不需要執行,就能夠完成 WAITFOR 陳述式引數。如需有關組態選項的詳細資訊,請參閱<query wait 選項>。若要查看使用中和等待中的處理序,請使用 sp_who

每個 WAITFOR 陳述式都有一個相關聯的執行緒。如果在相同伺服器上指定了許多 WAITFOR 陳述式,可以將許多執行緒繫結起來,以等待執行這些陳述式。SQL Server 會監視 WAITFOR 陳述式的相關聯執行緒數目,如果伺服器感到執行緒資源用盡,它會隨機選取某些要結束的執行緒。

您可以在也保留了鎖定以防止 WAITFOR 陳述式試圖存取的資料列集遭到改變的交易內,搭配 WAITFOR 執行查詢來建立死結。SQL Server 會識別這些狀況,並在這類死結有可能存在時,傳回空的結果集。

範例

A. 使用 WAITFOR TIME

下列範例會在 10:20 P.M. (22:20) 執行預存程序 sp_update_job。

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 AdventureWorks;
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.