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


WAITFOR (Transact-SQL)

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

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

Соглашения о синтаксисе 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_to_pass имеет формат чч:мм[[:сс].мсс].

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

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

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

Внимание

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

Примеры

А. Использование инструкции 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  

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