WAITFOR (Transact-SQL)
Data aggiornamento: 5 dicembre 2005
Blocca l'esecuzione di un batch, una stored procedure o una transazione fino all'ora specificata o finché è trascorso l'intervallo di tempo specificato oppure finché un'istruzione specifica modifica o restituisce almeno una riga.
Convenzioni della sintassi Transact-SQL
Sintassi
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}
Argomenti
- DELAY
Periodo di tempo specificato che deve trascorrere (massimo 24 ore) prima che l'esecuzione di un batch, una stored procedure o una transazione possa continuare.
- 'time_to_pass'
Periodo di tempo di attesa. time_to_pass può essere specificato in uno dei formati validi per i dati di tipo datetime oppure come variabile locale. Non è possibile specificare date, pertanto la parte relativa alla data del valore datetime non è consentita.
- TIME
Ora specificata di esecuzione del batch, della stored procedure o della transazione.
- 'time_to_execute'
Ora in cui l'istruzione WAITFOR viene interrotta. time_to_execute può essere specificato in uno dei formati validi per i dati di tipo datetime oppure come variabile locale. Non è possibile specificare date, pertanto la parte relativa alla data del valore datetime non è consentita.
receive_statement
Istruzione RECEIVE valida.Importante: L'utilizzo di WAITFOR con receive_statement è consentito solo per i messaggi di Service Broker. Per ulteriori informazioni, vedere RECEIVE (Transact-SQL).
get_conversation_group_statement
Istruzione GET CONVERSATION GROUP valida.Importante: L'utilizzo di WAITFOR con get_conversation_group_statement è consentito solo per i messaggi di Service Broker. Per ulteriori informazioni, vedere GET CONVERSATION GROUP (Transact-SQL).
TIMEOUT timeout
Specifica il periodo di tempo, espresso in millisecondi, di attesa dell'arrivo di un messaggio nella coda.Importante: La specifica di WAITFOR con TIMEOUT è consentita solo per i messaggi di Service Broker. Per ulteriori informazioni, vedere RECEIVE (Transact-SQL) e GET CONVERSATION GROUP (Transact-SQL).
Osservazioni
Durante l'esecuzione dell'istruzione WAITFOR la transazione è in esecuzione e pertanto non possono essere eseguite altre richieste nell'ambito della stessa transazione.
Il ritardo di tempo effettivo può variare rispetto al tempo specificato in time_to_pass, time_to_execute o timeout e dipende dal livello di attività del server. Il contatore del tempo viene avviato alla pianificazione del thread associato all'istruzione WAITFOR. Se il server è occupato, è possibile che il thread non venga pianificato immediatamente e che il ritardo di tempo risulti superiore al tempo specificato.
WAITFOR non modifica la semantica di una query. Se una query non è in grado di restituire righe, WAITFOR attenderà all'infinito oppure finché non viene raggiunto il valore dell'argomento TIMEOUT, se specificato.
Nelle istruzioni WAITFOR non è possibile aprire i cursori.
Nelle istruzioni WAITFOR non è possibile definire le viste.
Se la query supera il valore specificato dall'opzione querywait, l'argomento dell'istruzione WAITFOR può essere completato senza essere eseguito. Per ulteriori informazioni sull'opzione di configurazione, vedere Opzione query wait. Per visualizzare i processi attivi e in attesa, utilizzare sp_who.
A ogni istruzione WAITFOR è associato un thread. Se nello stesso server sono specificate numerose istruzioni WAITFOR, è possibile che numerosi thread siano in attesa dell'esecuzione di queste istruzioni. SQL Server esegue il monitoraggio del numero di thread associati alle istruzioni WAITFOR e ne seleziona casualmente alcuni per forzarne l'uscita se si verifica una mancanza di thread a livello di server.
È possibile creare un deadlock mediante l'esecuzione di una query con l'istruzione WAITFOR all'interno di una transazione che include anche blocchi che impediscono di apportare modifiche al set di righe a cui l'istruzione WAITFOR sta cercando di accedere. SQL Server identifica questi scenari e restituisce un set di risultati vuoto se esiste la probabilità che si verifichi tale deadlock.
Esempi
A. Utilizzo di WAITFOR TIME
Nell'esempio seguente la stored procedure sp_update_job
viene eseguita alle 22:20 (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. Utilizzo di WAITFOR DELAY
Nell'esempio seguente la stored procedure viene eseguita dopo un ritardo di due ore.
BEGIN
WAITFOR DELAY '02:00';
EXECUTE sp_helpdb;
END;
GO
C. Utilizzo di WAITFOR DELAY con una variabile locale
Nell'esempio seguente viene illustrato l'utilizzo di una variabile locale con l'opzione WAITFOR DELAY
. Viene creata una stored procedure in modo che attenda un periodo di tempo variabile, quindi vengono restituite informazioni sul numero di ore, minuti e secondi trascorsi.
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
Set di risultati:
A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.
Vedere anche
Riferimento
Elementi del linguaggio per il controllo di flusso (Transact-SQL)
Tipi di dati data/ora (Transact-SQL)
sp_who (Transact-SQL)
Altre risorse
Utilizzo di WAITFOR
Pianificazione delle attività o dei batch di SQL Server
Guida in linea e informazioni
Cronologia modifiche
Versione | Cronologia |
---|---|
5 dicembre 2005 |
|