Freigeben über


WAITFOR (Transact-SQL)

Blockiert die Ausführung eines Batches, einer gespeicherten Prozedur oder einer Transaktion bis zum Erreichen einer bestimmten Zeit oder eines bestimmten Zeitintervalls, oder bis eine angegebene Anweisung mindestens eine Zeile ändert oder zurückgibt.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

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, der gewartet werden soll. time_to_pass kann in einem der zulässigen Formate für datetime-Daten oder als lokale Variable angegeben werden. Es können keine Datumsangaben gemacht werden, daher ist der Datumsteil des datetime-Wertes nicht zulässig.

  • 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 in einem der zulässigen Formate für datetime-Daten oder als lokale Variable angegeben werden. Es können keine Datumsangaben gemacht werden, daher ist der Datumsteil des datetime-Wertes nicht zulässig.

  • receive_statement
    Eine gültige RECEIVE-Anweisung.

    Wichtiger HinweisWichtig

    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.

    Wichtiger HinweisWichtig

    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.

    Wichtiger HinweisWichtig

    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).

Hinweise

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 der der WAITFOR-Anweisung zugeordnete Thread geplant ist. Ist der Server ausgelastet, ist der Thread möglicherweise nicht sofort geplant. Daher kann die Zeitverzögerung länger sein als die angegebene Zeit.

WAITFOR nimmt keine Änderung an der Semantik einer Abfrage vor. Wenn die Abfrage keine Zeilen zurückgeben kann, hält die Wartezeit von WAITFOREVER 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 query wait überschreitet, kann das Argument der WAITFOR-Anweisung abgeschlossen werden, ohne dass es zur Ausführung kommt. Weitere Informationen zur Konfigurationsoption finden Sie unter query wait (Option). 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 der für WAITFOR-Anweisungen zugeordneten Threads 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 am Rowset enthält, auf das die WAITFOR-Anweisung zuzugreifen versucht. SQL Server identifiziert derartige Szenarien und gibt ein leeres Resultset zurück, wenn die Möglichkeit eines solchen Deadlocks vorhanden ist.

Beispiele

A. Verwenden von WAITFOR TIME

Im folgenden Beispiel wird die gespeicherte Prozedur sp_update_job um 22:20 Uhr ausgeführt. (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. 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. Es wird eine gespeicherte Prozedur erstellt, um einen variablen Zeitraum abzuwarten und dann Informationen bezüglich der verstrichenen Stunden, Minuten und Sekunden an den Benutzer zurückzugeben.

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

Dies ist das Resultset.

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