Partilhar via


ESPERA (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Bloqueia a execução de um lote, procedimento armazenado ou transação até que um intervalo de tempo ou intervalo de tempo especificado transcorra, ou uma instrução especificada modifique ou retorne pelo menos uma linha.

Transact-SQL convenções de sintaxe

Syntax

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

Arguments

ATRASO

O período de tempo especificado que deve passar, até um máximo de 24 horas, antes da execução de um lote, procedimento armazenado ou transação prossegue.

'time_to_pass'

O período de tempo para esperar. time_to_pass pode ser especificado em um formato de dados datetime ou como uma variável local. As datas não podem ser especificadas, portanto, a parte de data do valor datetime não é permitida. time_to_pass está formatado como hh:mm[[:ss].fff].

TIME

A hora especificada quando o lote, o procedimento armazenado ou a transação é executado.

'time_to_execute'

O momento em que a instrução WAITFOR termina. time_to_execute pode ser especificado em um formato de dados datetime ou pode ser especificado como uma variável local. As datas não podem ser especificadas, portanto, a parte de data do valor datetime não é permitida. time_to_execute está formatado como hh:mm[[:ss].fff] e pode, opcionalmente, incluir a data de 1900-01-01.

receive_statement

Aplica-se a: somente mensagens do Service Broker. Para obter mais informações, consulte RECEBER.

Uma declaração válida RECEIVE .

get_conversation_group_statement

Aplica-se a: somente mensagens do Service Broker. Para obter mais informações, consulte GET CONVERSATION GROUP.

Uma declaração válida GET CONVERSATION GROUP .

TIMEOUT

Aplica-se a: somente mensagens do Service Broker. Para obter mais informações, consulte RECEBER E OBTER GRUPO DE CONVERSAÇÃO.

Especifica o período de tempo, em milissegundos, para aguardar a chegada de uma mensagem na fila.

Remarks

Enquanto a WAITFOR instrução é executada, a transação está em execução e nenhuma outra solicitação pode ser executada sob a mesma transação.

O atraso real pode variar do tempo especificado em time_to_pass, time_to_execute ou tempo limite e depende do nível de atividade do servidor. O contador de tempo começa quando o thread de WAITFOR instrução é agendado. Se o servidor estiver ocupado, o thread pode não ser agendado imediatamente, portanto, o atraso pode ser maior do que o tempo especificado.

WAITFOR não altera a semântica de uma consulta. Se uma consulta não puder retornar nenhuma linha, WAITFOR aguardará para sempre ou até TIMEOUT ser alcançada, se especificado.

Os cursores não podem ser abertos em WAITFOR declarações.

As visualizações não podem ser definidas em WAITFOR declarações.

Quando a consulta excede a opção de espera de consulta, o argumento da WAITFOR instrução pode ser concluído sem ser executado. Para obter mais informações sobre a opção de configuração, consulte Configuração do servidor: espera de consulta. Para ver os processos ativos e em espera, use sp_who.

Cada WAITFOR instrução tem um thread associado a ela. Se muitas WAITFOR instruções forem especificadas no mesmo servidor, muitos threads poderão ser amarrados aguardando a execução dessas instruções. O SQL Server monitora o número de threads de WAITFOR instrução e seleciona aleatoriamente alguns desses threads para sair se o servidor começar a enfrentar fome de thread.

Você pode criar um deadlock executando uma consulta com WAITFOR dentro de uma transação que também contém bloqueios que impedem alterações no conjunto de linhas acessado WAITFOR pela instrução. O SQL Server identifica esses cenários e retorna um conjunto de resultados vazio se houver a chance de tal impasse.

Caution

A inclusão WAITFOR torna mais lenta a conclusão do processo do SQL Server e pode resultar em uma mensagem de tempo limite no aplicativo. Se necessário, ajuste a configuração de tempo limite para a conexão no nível do aplicativo.

Examples

A. Usar ESPERAR TEMPO

O exemplo a seguir executa o procedimento sp_update_job armazenado no banco de dados às msdb 22h20 (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. Usar WAITFOR DELAY

O exemplo a seguir executa o procedimento armazenado após um atraso de duas horas.

BEGIN
    WAITFOR DELAY '02:00';
    EXECUTE sp_helpdb;
END;
GO

C. Use WAITFOR DELAY com uma variável local

O exemplo a seguir mostra como uma variável local pode ser usada com a WAITFOR DELAY opção. Esse procedimento armazenado aguarda por um período de tempo variável e, em seguida, retorna informações ao usuário como o número decorrido de horas, minutos e segundos.

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

Aqui está o conjunto de resultados.

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