Condividi tramite


WAITFOR (Transact-SQL)

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.

Icona di collegamento a un argomentoConvenzioni 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.

    Nota importanteImportante

    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.

    Nota importanteImportante

    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.

    Nota importanteImportante

    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.