Condividi tramite


ASPETTA (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureDatabase 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

Syntax

WAITFOR
{
    DELAY 'time_to_pass'
  | TIME 'time_to_execute'
  | [ ( receive_statement ) | ( get_conversation_group_statement ) ]
    [ , TIMEOUT timeout ]
}

Arguments

DELAY

Periodo di tempo specificato che deve trascorrere, fino a un massimo di 24 ore, prima dell'esecuzione di un batch, di una stored procedure o di una transazione.

'time_to_pass'

Periodo di attesa. time_to_pass può essere specificato in un formato di dati datetime o come variabile locale. Non è possibile specificare date, quindi la parte data del valore datetime non è consentita. time_to_pass è formattato come hh:mm[[:ss].fff].

TIME

Ora specificata in cui viene eseguito il batch, la stored procedure o la transazione.

'time_to_execute'

Ora di completamento dell'istruzione WAITFOR. time_to_execute può essere specificato in un formato di dati datetime oppure può essere specificato come variabile locale. Non è possibile specificare date, quindi la parte data del valore datetime non è consentita. time_to_execute è formattato come hh:mm[[:ss].fff] e può includere facoltativamente la data di 1900-01-01.

receive_statement

Si applica a: solo messaggi di Service Broker. Per altre informazioni, vedere RECEIVE.

Istruzione valida RECEIVE .

get_conversation_group_statement

Si applica a: solo messaggi di Service Broker. Per altre informazioni, vedere GET CONVERSATION GROUP.

Istruzione valida GET CONVERSATION GROUP .

TIMEOUT TIMEOUT

Si applica a: solo messaggi di Service Broker. Per altre informazioni, vedere RECEIVE e GET CONVERSATION GROUP.

Specifica il periodo di tempo, espresso in millisecondi, di attesa dell'arrivo di un messaggio nella coda.

Remarks

Durante l'esecuzione dell'istruzione WAITFOR , la transazione è in esecuzione e nessun'altra richiesta può essere eseguita nella stessa transazione.

Il ritardo di tempo effettivo può variare dal tempo specificato in time_to_pass, time_to_execute o timeout e dipende dal livello di attività del server. Il contatore dell'ora inizia quando viene pianificato il thread dell'istruzione WAITFOR . Se il server è occupato, il thread potrebbe non essere pianificato immediatamente, quindi il ritardo di tempo potrebbe essere superiore al tempo specificato.

WAITFOR non modifica la semantica di una query. Se una query non può restituire righe, WAITFOR attende per sempre o finché TIMEOUT non viene raggiunto, se specificato.

I cursori non possono essere aperti nelle WAITFOR istruzioni.

Le viste non possono essere definite nelle WAITFOR istruzioni.

Quando la query supera l'opzione di attesa della query, l'argomento dell'istruzione WAITFOR può essere completato senza eseguire . Per altre informazioni sull'opzione di configurazione, vedere Configurazione del server: attesa query. Per visualizzare i processi attivi e in attesa, usare sp_who.

A ogni WAITFOR istruzione è associato un thread. Se nello stesso server vengono specificate molte WAITFOR istruzioni, è possibile collegare molti thread in attesa dell'esecuzione di queste istruzioni. SQL Server monitora il numero di thread di WAITFOR istruzioni e seleziona in modo casuale alcuni di questi thread da uscire se il server inizia a verificarsi la fame di thread.

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

Caution

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

Examples

A. Usare WAITFOR TIME

Nell'esempio seguente viene eseguita la stored procedure sp_update_job nel msdb database alle 10: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. Usare 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. Usare 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.