Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
SQL-Datenbank in Microsoft Fabric
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 ]
}
Arguments
DELAY
Der angegebene Zeitraum, der bis zu maximal 24 Stunden vor der Ausführung eines Batches, einer gespeicherten Prozedur oder eines Transaktionserlöses bestehen muss.
'time_to_pass'
Der Zeitraum, zu dem gewartet werden soll.
time_to_pass können entweder in einem Datetime-Datenformat oder als lokale Variable angegeben werden. Datumsangaben können nicht angegeben werden, sodass der Datumsteil des Datetime-Werts nicht zulässig ist.
time_to_pass ist formatiert als hh:mm[[:ss].fff].
TIME
Der angegebene Zeitpunkt, zu dem der Batch, die gespeicherte Prozedur oder die Transaktion ausgeführt wird.
'time_to_execute'
Die Uhrzeit, zu der die WAITFOR-Anweisung abgeschlossen ist.
time_to_execute können in einem Datetime-Datenformat angegeben oder als lokale Variable angegeben werden. Datumsangaben können nicht angegeben werden, sodass der Datumsteil des Datetime-Werts nicht zulässig ist.
time_to_execute ist formatiert und hh:mm[[:ss].fff] kann optional das Datum von 1900-01-01.
receive_statement
Gilt nur für: Nur Service Broker-Nachrichten. Weitere Informationen finden Sie unter RECEIVE.
Eine gültige RECEIVE Anweisung.
get_conversation_group_statement
Gilt nur für: Nur Service Broker-Nachrichten. Weitere Informationen finden Sie unter GET CONVERSATION GROUP.
Eine gültige GET CONVERSATION GROUP Anweisung.
TIMEOUT-Auszeit
Gilt nur für: Nur Service Broker-Nachrichten. Weitere Informationen finden Sie unter RECEIVE and GET CONVERSATION GROUP.
Gibt in Millisekunden den Zeitraum an, für dessen Dauer gewartet werden soll, bis eine Meldung die Warteschlange erreicht.
Remarks
Während die WAITFOR Anweisung ausgeführt wird, wird die Transaktion ausgeführt, und unter derselben Transaktion können keine anderen Anforderungen ausgeführt werden.
Die tatsächliche Zeitverzögerung kann von der in time_to_pass, time_to_execute oder Timeout angegebenen Zeit variieren und hängt von der Aktivitätsebene des Servers ab. Der Zeitzähler beginnt, wenn der Anweisungsthread WAITFOR geplant ist. Wenn der Server ausgelastet ist, wird der Thread möglicherweise nicht sofort geplant, sodass die Zeitverzögerung möglicherweise länger als die angegebene Zeit ist.
WAITFOR ändert die Semantik einer Abfrage nicht. Wenn eine Abfrage keine Zeilen zurückgeben kann, WAITFOR wartet sie ewig oder ist TIMEOUT erreicht, sofern angegeben.
Cursor können für Anweisungen nicht geöffnet WAITFOR werden.
Ansichten können nicht für WAITFOR Anweisungen definiert werden.
Wenn die Abfrage die Abfragewarteoption überschreitet, kann das WAITFOR Anweisungsargument ohne Ausführung abgeschlossen werden. Weitere Informationen zur Konfigurationsoption finden Sie unter Serverkonfiguration: Abfragewarte. Verwenden Sie sp_who, um die aktiven und wartenden Prozesse anzuzeigen.
Jeder WAITFOR Anweisung ist ein Thread zugeordnet. Wenn viele Anweisungen auf demselben Server angegeben sind, können viele WAITFOR Threads gebunden werden, die darauf warten, dass diese Anweisungen ausgeführt werden. SQL Server überwacht die Anzahl der WAITFOR Anweisungsthreads und wählt zufällig einige dieser Threads aus, die beendet werden sollen, wenn der Server mit threadverhung beginnt.
Sie können einen Deadlock erstellen, indem Sie eine Abfrage mit WAITFOR einer Transaktion ausführen, die auch Sperren enthält, um Änderungen am Rowset zu verhindern, auf das von der WAITFOR Anweisung zugegriffen wird. SQL Server identifiziert derartige Szenarien und gibt ein leeres Resultset zurück, wenn die Möglichkeit eines solchen Deadlocks vorhanden ist.
Caution
Das Einschließen WAITFOR verlangsamt den Abschluss des SQL Server-Prozesses und kann zu einer Timeoutnachricht in der Anwendung führen. Passen Sie die Timeouteinstellung für die Verbindung ggf. auf Anwendungsebene an.
Examples
A. VERWENDEN VON WAITFOR TIME
Im folgenden Beispiel wird die gespeicherte Prozedur sp_update_job in der msdb Datenbank um 10:20 Uhr (22:20) ausgeführt.
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 sehen Sie das Ergebnis.
A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.