WAITFOR (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Blockiert die Ausführung eines Batches, einer gespeicherten Prozedur oder einer Transaktion, bis eine bestimmte Zeit oder ein bestimmtes Zeitintervall verstrichen ist oder bis eine angegebene Anweisung mindestens eine Zeile ändert oder zurückgibt.

Transact-SQL-Syntaxkonventionen

Syntax

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

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

Argumente

DELAY
Die angegebene Zeit bis maximal 24 Stunden, die verstreichen muss, bevor die Ausführung eines Batches, einer gespeicherten Prozedur oder einer Transaktion fortgesetzt wird.

'time_to_pass'
Der Zeitraum, für dessen Dauer gewartet werden soll. time_to_pass kann entweder im datetime-Format oder als lokale Variable definiert werden. Es können keine Datumsangaben gemacht werden, daher ist der Datumsteil des datetime-Werts nicht zulässig. time_to_pass wird im Format hh:mm[[:ss].mss] angezeigt.

TIME
Die angegebene Zeit, zu der der Batch, die gespeicherte Prozedur oder die Transaktion ausgeführt wird.

'time_to_execute'
Die Zeit, zu der die WAITFOR-Anweisung beendet wird. time_to_execute kann im datetime-Format oder als lokale Variable definiert werden. Es können keine Datumsangaben gemacht werden, daher ist der Datumsteil des datetime-Werts nicht zulässig. time_to_execute wird im Format hh:mm[[:ss].mss] angezeigt und kann optional auch ein Datum im Format 1900-01-01 enthalten.

receive_statement
Eine gültige RECEIVE-Anweisung.

Wichtig

Zusammen mit receive_statement kann WAITFOR nur für Service Broker-Meldungen verwendet werden. Weitere Informationen finden Sie unter RECEIVE (Transact-SQL).

get_conversation_group_statement
Eine gültige GET CONVERSATION GROUP-Anweisung.

Wichtig

Zusammen mit get_conversation_group_statement kann WAITFOR nur für Service Broker-Meldungen verwendet werden. Weitere Informationen finden Sie unter GET CONVERSATION GROUP (Transact-SQL).

TIMEOUT timeout
Gibt in Millisekunden den Zeitraum an, für dessen Dauer gewartet werden soll, bis eine Meldung die Warteschlange erreicht.

Wichtig

Zusammen mit TIMEOUT kann WAITFOR nur für Service Broker-Meldungen verwendet werden. Weitere Informationen finden Sie unter RECEIVE (Transact-SQL) und GET CONVERSATION GROUP (Transact-SQL).

Bemerkungen

Während der Ausführung der WAITFOR-Anweisung ist die Transaktion im Gange, sodass keine weiteren Anforderungen für dieselbe Transaktion ausgeführt werden können.

Die tatsächliche Zeitverzögerung kann von der in time_to_pass, time_to_execute oder timeout angegebenen Zeit abweichen und hängt von der Aktivitätsstufe des Servers ab. Die Zeitzählung beginnt, wenn die WAITFOR-Anweisung geplant ist. Wenn der Server ausgelastet ist, wird der Thread möglicherweise nicht sofort geplant. Daher kann die Zeitverzögerung länger als die angegebene Zeit sein.

WAITFOR nimmt keine Änderung an der Semantik einer Abfrage vor. Wenn die Abfrage keine Zeilen zurückgeben kann, hält die Wartezeit von WAITFOR endlos oder bis zum Erreichen von TIMEOUT (falls angegeben) an.

Cursor können nicht für WAITFOR-Anweisungen geöffnet werden.

Ansichten können nicht für WAITFOR-Anweisungen definiert werden.

Falls die Abfrage die Option Abfragewartezeit überschreitet, kann das Argument der WAITFOR-Anweisung abgeschlossen werden, ohne dass es zur Ausführung kommt. Weitere Informationen zur Konfigurationsoption finden Sie unter Konfigurieren der Serverkonfigurationsoption Abfragewartezeit. Mit sp_who zeigen Sie die aktiven und wartenden Prozesse an.

Jeder WAITFOR-Anweisung ist ein Thread zugeordnet. Wenn viele WAITFOR-Anweisungen auf demselben Server angegeben werden, können auch viele Threads durch das Warten auf die Ausführung dieser Anweisungen gebunden werden. SQL Server überwacht die Anzahl die Threads der WAITFOR-Anweisungen und beendet einige davon per Zufallsauswahl, sobald Threads des Servers nicht mehr auf die CPU zugreifen können.

Sie können einen Deadlock erstellen, indem Sie eine Abfrage mit WAITFOR innerhalb einer Transaktion ausführen, die auch Sperren zur Verhinderung von Änderungen an dem Rowset enthält, auf das die WAITFOR-Anweisung zugreift. SQL Server identifiziert derartige Szenarien und gibt ein leeres Resultset zurück, wenn die Möglichkeit eines solchen Deadlocks vorhanden ist.

Achtung

Durch das Einfügen von WAITFOR wird die Beendigung des SQL Server-Prozesses verlangsamt, was zu einer Timeoutmeldung in der Anwendung führen kann. Passen Sie die Timeouteinstellung für die Verbindung ggf. auf Anwendungsebene an.

Beispiele

A. Verwenden von WAITFOR TIME

Im folgenden Beispiel wird die gespeicherte Prozedur sp_update_job in der msdb-Datenbank um 22:20 Uhr ausgeführt (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. Verwenden von WAITFOR DELAY

Das folgende Beispiel führt die gespeicherte Prozedur nach einer Verzögerung von 2 Stunden aus.

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

C. Verwenden von WAITFOR DELAY mit einer lokalen Variablen

Das folgende Beispiel zeigt, wie Sie eine lokale Variable mit der Option WAITFOR DELAY verwenden. Diese gespeicherte Prozedur wartet einen variablen Zeitraum ab und gibt dann Informationen bezüglich der verstrichenen Stunden, Minuten und Sekunden an den Benutzer zurück.

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  

Hier ist das Resultset.

A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.

Weitere Informationen

Ablaufsteuerungssprache (Transact-SQL)
datetime (Transact-SQL)
sp_who (Transact-SQL)