使用 WAITFOR

WAITFOR 陳述式會暫停批次、預存程序或交易的執行,直到:

  • 超過指定時間間隔 (Time Interval)。

  • 到達指定時間。

  • 指定的 RECEIVE 陳述式會修改或傳回至少一列資料列給 Service Broker 佇列。

實際的時間延遲可能與指定的時間不同,而且會隨著伺服器的活動層級而異。排定與 WAITFOR 陳述式相關聯的執行緒後,時間計數器便會啟動。如果伺服器處於忙碌狀態,執行緒可能不會立即排程;因此時間延遲可能比指定的時間還長。

以下列其中一個子句來指定 WAITFOR 陳述式:

  • 後面接著 time_to_pass 的 DELAY 關鍵字,可用來指定完成 WAITFOR 陳述式之前的等待時間。完成 WAITFOR 陳述式前需等待的時間,最多 24 小時。

    下列範例使用 DELAY 關鍵字,指定在執行 SELECT 陳述式之前需等兩秒:

    WAITFOR DELAY '00:00:02';
    SELECT BusinessEntityID FROM AdventureWorks2008R2.HumanResources.Employee;
    
  • 後面接著 time_to_execute 的 TIME 關鍵字,可用來指定 WAITFOR 陳述式完成的時間。

    下列範例使用 TIME 關鍵字,指定等到晚上 10 點 (22:00) 再執行 AdventureWorks 資料庫的檢查,以確定所有頁面的配置及用法無誤:

    USE AdventureWorks2008R2;
    GO
    BEGIN
        WAITFOR TIME '22:00';
        DBCC CHECKALLOC;
    END;
    GO
    
  • RECEIVE 陳述式子句,可從 Service Broker 佇列擷取一或多則訊息。當 WAITFOR 與 RECEIVE 陳述式一起指定時,若目前未出現訊息,則陳述式會等候訊息到達佇列。

  • 後面接著 timeout 的 TIMEOUT 關鍵字可指定時間長度 (以毫秒為單位),這是 Service Broker 等候訊息到達佇列的時間長度。TIMEOUT 可以在 RECEIVE 陳述式或在 GET CONVERSATION GROUP 陳述式中加以指定。