Compartilhar via


ESPERA (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureBanco de dados SQL no Microsoft Fabric

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

Convenções de sintaxe de Transact-SQL

Syntax

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

Arguments

DELAY

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 continuação da transação.

'time_to_pass'

O período de espera. 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 é formatado como hh:mm[[:ss].fff].

TIME

A hora especificada em que o lote, o procedimento armazenado ou a transação são executados.

'time_to_execute'

A hora em que a instrução WAITFOR é concluída. 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 é formatado como hh:mm[[:ss].fff] e, opcionalmente, pode incluir a data de 1900-01-01.

receive_statement

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

Uma instrução válida RECEIVE .

get_conversation_group_statement

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

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

TEMPO DE ESPERA

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

Especifica o período de hora, em milissegundos, a esperar pela 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 na mesma transação.

O atraso de tempo 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 é iniciado quando o thread de WAITFOR instrução é agendado. Se o servidor estiver ocupado, o thread poderá não ser agendado imediatamente, portanto, o atraso de tempo poderá 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 que seja atingida, se especificado.

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

As exibições não podem ser definidas em WAITFOR instruções.

Quando a consulta excede a opção de espera de consulta, o argumento de WAITFOR instrução pode ser concluído sem ser executado. Para obter mais informações sobre a opção de configuração, consulte a configuração do servidor: espera de consulta. Para ver os processos ativos e de 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 vinculados aguardando a execução dessas instruções. O SQL Server monitora o número de threads de instrução e seleciona aleatoriamente alguns desses threads para sair se o servidor começar a experimentar a falta de WAITFOR thread.

Você pode criar um deadlock executando uma consulta com WAITFOR uma transação que também contém bloqueios impedindo alterações no conjunto de linhas acessado pela instrução WAITFOR . O SQL Server identifica esses cenários e retorna um conjunto de resultados vazio, no caso de esse deadlock existir.

Caution

A inclusão WAITFOR retarda 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 em nível de aplicativo.

Examples

A. Usar WAITFOR TIME

O exemplo a seguir executa o procedimento sp_update_job armazenado no msdb banco de dados às 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 depois de um atraso de duas horas.

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

C. Usar WAITFOR DELAY com uma variável local

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

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

Veja a seguir o conjunto de resultados.

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