WAITFOR (Transact-SQL)

Блокирует выполнение пакета, хранимой процедуры или транзакции до наступления указанного времени или интервала времени, либо заданная инструкция изменяет или возвращает, по крайней мере, одну строку.

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Azure (С первоначального выпуска по текущий выпуск).

Значок ссылки на раздел Синтаксические обозначения в Transact-SQL

Синтаксис

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

Аргументы

  • DELAY
    Заданный период времени (не более 24 часов), который должен пройти до выполнения пакета, хранимой процедуры или продолжения транзакции.

  • 'time_to_pass'
    Период времени ожидания. Аргумент time_to_pass может быть задан в одном из допустимых форматов для данных типа datetime или в виде локальной переменной. Даты не могут быть указаны, поэтому часть значения datetime, относящаяся к дате, не разрешена.

  • TIME
    Заданное время выполнения пакета, хранимой процедуры или транзакции.

  • 'time_to_execute'
    Время, в которое инструкция WAITFOR завершает работу. Аргумент time_to_execute может быть задан в одном из допустимых форматов для данных типа datetime или в виде локальной переменной. Даты не могут быть указаны, поэтому часть значения datetime, относящаяся к дате, не разрешена.

  • receive_statement
    Допустимая инструкция RECEIVE.

    Важное примечаниеВажно!

    Инструкция WAITFOR с аргументом receive_statement применима только к сообщениям компонента Компонент Service Broker.Дополнительные сведения см. в разделе RECEIVE (Transact-SQL).

  • get_conversation_group_statement
    Допустимая инструкция GET CONVERSATION GROUP.

    Важное примечаниеВажно!

    Инструкция WAITFOR с аргументом get_conversation_group_statement применима только к сообщениям компонента Компонент Service Broker.Дополнительные сведения см. в разделе GET CONVERSATION GROUP (Transact-SQL).

  • TIMEOUT timeout
    Указывает период времени ожидания очередного сообщения (в миллисекундах).

    Важное примечаниеВажно!

    Инструкция WAITFOR с аргументом TIMEOUT применима только к сообщениям компонента Компонент Service Broker.Дополнительные сведения см. в разделах RECEIVE (Transact-SQL) и GET CONVERSATION GROUP (Transact-SQL).

Замечания

Во время выполнения инструкции WAITFOR выполняется транзакция, и другие запросы не могут быть выполнены в рамках этой транзакции.

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

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

Для инструкций WAITFOR невозможно открыть курсоры.

Для инструкций WAITFOR невозможно указать представления.

Если запрос превышает значение, заданное параметром query wait, то параметр инструкции WAITFOR может завершиться без выполнения. Дополнительные сведения об этом параметре конфигурации см. в разделе Настройка параметра конфигурации сервера query wait. Чтобы просмотреть активные и ожидающие процессы, используйте процедуру sp_who.

Каждая инструкция WAITFOR имеет связанный с ней поток. Если на одном сервере задано несколько инструкций WAITFOR, то можно объединить несколько потоков, ожидающих выполнения этих инструкций. SQL Server отслеживает количество потоков, связанных с инструкциями WAITFOR, и случайным образом завершает работу нескольких из этих потоков, если на сервере имеет место нехватка потоков.

Можно создать взаимоблокировку, выполнив запрос с инструкцией WAITFOR в транзакции, также поддерживающей блокировки для предотвращения изменений набора строк, к которым пытается обратиться инструкция WAITFOR. SQL Server идентифицирует эти сценарии и возвращает пустой результирующий набор, если есть вероятность такой взаимоблокировки.

Предупреждение

При использовании WAITFOR выполнение процесса SQL Server замедляется, из-за чего в приложении может открыться сообщение об истечении времени ожидания.При необходимости измените заданное время ожидания для подключения на уровне приложения.

Примеры

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

В следующем примере выполняется хранимая процедура sp_update_job в базе данных msdb в 22: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

Б.Использование WAITFOR DELAY

В следующем примере хранимая процедура выполняется после 2-часовой задержки.

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

В.Использование WAITFOR DELAY с локальной переменной

Следующий пример показывает, как можно использовать локальную переменную с параметром WAITFOR DELAY. Хранимая процедура создается для ожидания переменного периода времени и возвращает пользователю данные относительно количества истекших часов, минут и секунд.

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

Ниже приводится результирующий набор.

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

См. также

Справочник

Язык управления потоком (Transact-SQL)

datetime (Transact-SQL)

sp_who (Transact-SQL)