Поделиться через


WAITFOR (Transact-SQL)

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

Значок ссылки на разделСинтаксические обозначения в 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 определяет эти сценарии и, если существует возможность такой взаимоблокировки, возвращает пустой результирующий набор.

Примеры

A. Использование WAITFOR TIME

Этот пример выполняет хранимую процедуру sp_update_job в 22:20. (22:20).

USE msdb;
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. Хранимая процедура создается для ожидания переменного периода времени и возвращает пользователю данные относительно количества истекших часов, минут и секунд.

USE AdventureWorks2008R2;
GO
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

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

Прошло общее время 00:00:10, в формате чч:мм:сс. Ваше время истекло.