Использование инструкции WAITFOR

Инструкция WAITFOR приостанавливает выполнение пакета, хранимой процедуры или транзакции до тех пор, пока:

  • не пройдет заданный интервал времени;

  • не наступит заданное время суток;

  • инструкция RECEIVE не изменит или не возвратит, по крайней мере, одну строку в очередь компонента Service Broker.

Действительная продолжительность задержки может отличаться от заданного времени и зависит от уровня загруженности сервера. Счетчик времени запускается, когда запланирован поток, связанный с инструкцией WAITFOR. Если сервер занят, запланированный запуск потока может оказаться невозможным, поэтому время задержки может оказаться больше заданного.

Инструкция WAITFOR задается с одним из следующих предложений.

  • Ключевым словом DELAY, за которым следует аргумент time_to_pass времени до завершения инструкции WAITFOR. Период времени ожидания завершения инструкции WAITFOR может задаваться до 24 часов.

    В следующем примере ключевое слово DELAY используется для установки ожидания в течение двух секунд до выполнения инструкции SELECT:

    WAITFOR DELAY '00:00:02';
    SELECT BusinessEntityID FROM AdventureWorks2008R2.HumanResources.Employee;
    
  • Ключевым словом TIME, за которым следует аргумент time_to_execute, задающий время завершения инструкции WAITFOR.

    В следующем примере ключевое слово TIME используется для ожидания наступления 22:00 (22:00) для выполнения проверки базы данных AdventureWorks на предмет правильного выделения и использования всех страниц:

    USE AdventureWorks2008R2;
    GO
    BEGIN
        WAITFOR TIME '22:00';
        DBCC CHECKALLOC;
    END;
    GO
    
  • Предложением инструкции RECEIVE, извлекающим одно или несколько сообщений из очереди компонента Service Broker. Если инструкция WAITFOR задается с инструкцией RECEIVE, выполняется ожидание прибытия в очередь сообщения, если в настоящее время в очереди нет никаких сообщений.

  • Ключевым словом TIMEOUT, за которым следует аргумент timeout, задается период времени в миллисекундах, в течение которого компонент Service Broker ожидает прибытия сообщения в очередь. Ключевое слово TIMEOUT может быть задано в инструкции RECEIVE или в инструкции GET CONVERSATION GROUP.