WAITFOR (Transact-SQL)
Aktualisiert: 05. Dezember 2005
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.
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.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).
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 querywait ü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
Das folgende Beispiel führt die gespeicherte Prozedur sp_update_job
um 22:20 (22:20
) aus.
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 AdventureWorks;
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.
Siehe auch
Verweis
Ablaufsteuerungssprache (Transact-SQL)
Datum und Uhrzeit (Transact-SQL)
sp_who (Transact-SQL)
Andere Ressourcen
Verwenden von WAITFOR
Planen von Batches oder Tasks in SQL Server
Hilfe und Informationen
Informationsquellen für SQL Server 2005
Änderungsverlauf
Version | Verlauf |
---|---|
05. Dezember 2005 |
|