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


WAITFOR (Transact-SQL)

Применимо к:SQL ServerБаза данных Azure SQLУправляемый экземпляр Azure SQLБаза данных SQL в предварительной версии Microsoft Fabric

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

Соглашения о синтаксисе Transact-SQL

Syntax

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

Arguments

DELAY

Указанный период времени, который должен пройти до 24 часов до выполнения пакета, хранимой процедуры или транзакции.

'time_to_pass'

Период времени ожидания. time_to_pass можно указать в формате данных datetime или в виде локальной переменной. Не удается указать даты, поэтому часть даты значения даты и времени не разрешена. time_to_pass форматируется как hh:mm[[:ss].fff].

TIME

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

'time_to_execute'

Время завершения инструкции WAITFOR. time_to_execute можно указать в формате данных datetime или в качестве локальной переменной. Не удается указать даты, поэтому часть даты значения даты и времени не разрешена. time_to_execute форматируется как hh:mm[[:ss].fff] и может при необходимости включать дату 1900-01-01.

receive_statement

Применяется только к сообщениям Service Broker. Дополнительные сведения см. в разделе RECEIVE.

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

get_conversation_group_statement

Применяется только к сообщениям Service Broker. Дополнительные сведения см. в разделе GET CONVERSATION GROUP.

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

TIMEOUT timeout

Применяется только к сообщениям Service Broker. Дополнительные сведения см. в разделе RECEIVE и GET CONVERSATION GROUP.

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

Remarks

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

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

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

Курсоры нельзя открывать в WAITFOR инструкциях.

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

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

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

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

Caution

Включая WAITFOR замедление завершения процесса SQL Server и может привести к истечении времени ожидания в приложении. При необходимости отрегулируйте значение времени ожидания для соединения на уровне приложения.

Examples

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

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

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

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

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

C. Использование 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.