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值的日期
部分。
time_to_pass
格式為
hh:mm[[:ss].fff]
。
批次、預存程式或交易執行的指定時間。
'
time_to_execute
'
WAITFOR 語句完成的時間。
time_to_execute
可以
指定日期時間
數據格式,也可以指定為局部變數。 無法指定日期,因此不允許
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
和
GET CONVERSATION GROUP
。
指定等待訊息到達佇列的時段 (以毫秒為單位)。
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';
B. 使用 WAITFOR DELAY
下列範例會在延遲兩小時之後執行預存程序。
BEGIN
WAITFOR DELAY '02:00';
EXECUTE sp_helpdb;
C. 搭配局部變數使用 WAITFOR DELAY
下列範例顯示如何搭配 WAITFOR DELAY
選項來使用本機變數。 這預存程序會等待一陣可變的時段,再將經歷的時、分、秒數資訊傳回給使用者。
IF OBJECT_ID('dbo.TimeDelay_hh_mm_ss','P') IS NOT NULL
DROP PROCEDURE dbo.TimeDelay_hh_mm_ss;
CREATE PROCEDURE dbo.TimeDelay_hh_mm_ss (@DelayLength char(8)= '00:00:00')
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)
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;
/* This statement executes the dbo.TimeDelay_hh_mm_ss procedure. */
EXEC TimeDelay_hh_mm_ss '00:00:10';
結果集如下所示。
A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.
Related content
Control-of-Flow
datetime (Transact-SQL)
sp_who (Transact-SQL)