Condividi tramite


WAITFOR (Transact-SQL)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure database SQL in Microsoft Fabric

Blocca l'esecuzione di un batch, una stored procedure o una transazione fino all'ora specificata o fino a quando non è trascorso l'intervallo di tempo specificato oppure finché un'istruzione specificata non modifica o restituisce almeno una riga.

Convenzioni relative alla 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 un formato dati datetime o come variabile locale. Non è possibile specificare date, pertanto la parte relativa alla data del valore datetime non è consentita. time_to_pass è formattato come hh:mm[[:ss].mss].

ORA
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 un formato dati datetime oppure come variabile locale. Non è possibile specificare date, pertanto la parte relativa alla data del valore datetime non è consentita. time_to_execute è formattato come hh:mm[[:ss].mss] e può includere facoltativamente la data 1900-01-01.

receive_statement
Istruzione RECEIVE valida.

Importante

L'uso di WAITFOR con receive_statement è consentito solo per i messaggi di Service Broker. Per altre informazioni, vedere RECEIVE (Transact-SQL).

get_conversation_group_statement
Istruzione GET CONVERSATION GROUP valida.

Importante

L'uso di WAITFOR con get_conversation_group_statement è consentito solo per i messaggi di Service Broker. Per altre 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 altre 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 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 dell'istruzione WAITFOR. Se il server è occupato, è possibile che il thread non venga pianificato immediatamente e che il ritardo 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 query wait, l'argomento dell'istruzione WAITFOR può essere completato senza essere eseguito. Per altre informazioni sull'opzione di configurazione, vedere Configurare l'opzione di configurazione del server query wait. Per visualizzare i processi attivi e in attesa, usare 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 monitora il numero di thread dell'istruzione WAITFOR e ne seleziona casualmente alcuni per forzarne l'uscita se nel server inizia a verificarsi una condizione di "thread starvation".

L'esecuzione di una query con WAITFOR all'interno di una transazione che include anche blocchi che impediscono le modifiche al set di righe a cui accede l'istruzione WAITFOR può creare un deadlock. SQL Server identifica questi scenari e restituisce un set di risultati vuoto se esiste la probabilità che si verifichi tale deadlock.

Attenzione

L'inclusione di WAITFOR rallenterà il completamento del processo SQL Server e può generare un messaggio di timeout nell'applicazione. Se necessario, regolare l'impostazione di timeout per la connessione a livello di applicazione.

Esempi

R. Utilizzo di WAITFOR TIME

Nell'esempio seguente la stored procedure sp_update_job viene eseguita nel database msdb alle ore 22:20 (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. 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. Questa stored procedure rimane in attesa per un periodo di tempo variabile e quindi restituisce all'utente informazioni sul numero di ore, minuti e secondi trascorsi.

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  

Il set di risultati è il seguente.

A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.

Vedi anche

Control-of-Flow Language (Transact-SQL)
datetime (Transact-SQL)
sp_who (Transact-SQL)