Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureБаза данных 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 инструкция.
ТАЙМ-аут
Применяется только к сообщениям 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.