WAITFOR (Transact-SQL)
Изменения: 5 декабря 2005 г.
Блокирует выполнение пакета, хранимой процедуры или транзакции до наступления указанного времени или интервала времени, либо заданная инструкция изменяет или возвращает, по крайней мере, одну строку.
Синтаксические обозначения в 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
в 10: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 AdventureWorks;
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
Ниже приводится результирующий набор.
A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.
См. также
Справочник
Язык управления потоком (Transact-SQL)
Дата и время (Transact-SQL)
sp_who (Transact-SQL)
Другие ресурсы
Использование инструкции WAITFOR
Работа с расписаниями задач и пакетов SQL Server
Справка и поддержка
Получение помощи по SQL Server 2005
Журнал изменений
Версия | Журнал |
---|---|
5 декабря 2005 г. |
|