Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: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.