WAITFOR (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance 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 ]
}
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 sehen Sie das Ergebnis.
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)