Compartilhar via


Usando WAITFOR

A instrução WAITFOR suspende a execução de um lote, procedimento armazenado ou transação até que:

  • Um intervalo de tempo especificado tenha passado.

  • Uma hora especificada do dia seja alcançada.

  • Uma instrução RECEIVE especificada modifique ou retorne pelo menos uma linha a uma fila do Agente de Serviços.

O atraso de tempo real pode variar da hora especificada e depende do nível de atividade do servidor. O contador de tempo iniciará quando o thread associado à instrução WAITFOR for agendado. Se o servidor estiver ocupado, o thread poderá não ser agendado imediatamente; portanto, o atraso de tempo pode ser maior que o tempo especificado.

A instrução WAITFOR é especificada com uma das seguintes cláusulas:

  • A palavra-chave DELAY seguida por um time_to_pass antes de completar a instrução WAITFOR. O tempo de espera antes de completar a instrução WAITFOR pode ser de até 24 horas.

    O seguinte exemplo usa a palavra-chave DELAY para aguardar por dois segundos antes de executar uma instrução SELECT:

    WAITFOR DELAY '00:00:02';
    SELECT EmployeeID FROM AdventureWorks.HumanResources.Employee;
    
  • A palavra-chave TIME seguida por um time_to_executeque especifica a hora que a instrução WAITFOR é concluída.

    O seguinte exemplo usa a palavra-chave TIME para aguardar até as 22 horas. (22:00) para executar uma verificação do banco de dados AdventureWorks para assegurar que todas as páginas estejam corretamente alocadas e usadas:

    USE AdventureWorks;
    GO
    BEGIN
        WAITFOR TIME '22:00';
        DBCC CHECKALLOC;
    END;
    GO
    
  • Uma cláusula de instrução RECEIVE que recupera uma ou mais mensagens de uma fila do Agente de Serviços. Quando WAITFOR é especificada com uma instrução RECEIVE, a instrução aguarda pela mensagem para chegar à fila, se nenhuma mensagem estiver presente no momento.

  • A palavra-chave TIMEOUT seguida por um timeout especifica quanto tempo, em milissegundos, o Service Broker espera por uma mensagem para chegar à fila. O TIMEOUT pode ser especificado na instrução RECEIVE ou na instrução GET CONVERSATION GROUP.