지정된 시간 또는 시간 간격에 도달하거나 지정된 문이 최소 한 행을 수정 또는 반환할 때까지 일괄 처리, 저장 프로시저 또는 트랜잭션의 실행을 차단합니다.
WAITFOR { DELAY 'time_to_pass' | TIME 'time_to_execute' | ( receive_statement ) [ , TIMEOUT timeout ] }
주의)
WAITFOR 문을 실행하는 동안 트랜잭션이 실행되며 같은 트랜잭션에서 다른 요청을 실행할 수 없습니다.
WAITFOR는 쿼리의 기능을 변경하지 않습니다. 쿼리가 행을 반환할 수 없을 경우 WAITFOR는 계속 대기하거나 TIMEOUT(지정된 경우)에 도달할 때까지 대기합니다.
WAITFOR 문에서는 커서를 열 수 없습니다.
WAITFOR 문에서는 뷰를 정의할 수 없습니다.
쿼리가 query wait 옵션을 초과하면 WAITFOR 문 인수를 실행하지 않고 완료할 수 있습니다. 구성 옵션에 대한 자세한 내용은
각 WAITFOR 문에는 연결된 스레드가 있습니다. 같은 서버에 많은 WAITFOR 문이 지정된 경우 많은 스레드가 이러한 문의 실행을 대기하느라 정체될 수 있습니다. SQL Server 는 WAITFOR 문과 연결된 스레드의 수를 모니터링하고 서버에 스레드 부족이 발생하기 시작할 경우 스레드 중 일부를 임의로 선택하여 종료합니다.
WAITFOR 문이 액세스를 시도하는 행 집합에 대한 변경을 방지하는 잠금을 보유한 트랜잭션 내에서 WAITFOR가 있는 쿼리를 실행하면 교착 상태가 발생할 수 있습니다. SQL Server 는 이러한 시나리오를 식별하고 이러한 교착 상태가 존재할 가능성이 있는 경우 빈 결과 집합을 반환합니다.
- DELAY
-
일괄 처리, 저장 프로시저 또는 트랜잭션을 실행하기 전에 대기하도록 지정된 시간으로 최대 24시간이 될 수 있습니다.
- 'time_to_pass'
-
대기할 총 시간입니다. time_to_pass는 datetime 데이터로 사용할 수 있는 형식 중 하나를 사용하여 지정하거나 로컬 변수로 지정할 수 있습니다. 날짜를 지정할 수 없으므로 datetime 값의 날짜 부분은 허용되지 않습니다.
- TIME
-
일괄 처리, 저장 프로시저 또는 트랜잭션을 실행하도록 지정된 시간입니다.
- 'time_to_execute'
-
WAITFOR 문이 종료되는 시간입니다. time_to_execute는 datetime 데이터로 사용할 수 있는 형식 중 하나를 사용하여 지정하거나 로컬 변수로 지정할 수 있습니다. 날짜를 지정할 수 없으므로 datetime 값의 날짜 부분은 허용되지 않습니다.
- receive_statement
-
유효한 RECEIVE 문입니다.
- TIMEOUT timeout
-
메시지가 큐에 도착하기를 대기할 시간(밀리초)을 지정합니다.
1. WAITFOR TIME 사용
다음 예에서는 sp_update_job
저장 프로시저를 오후 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
2. WAITFOR DELAY 사용
다음 예에서는 2시간 지연 후에 저장 프로시저를 실행합니다.
BEGIN WAITFOR DELAY '02:00'; EXECUTE sp_helpdb; END; GO
3. 로컬 변수와 함께 WAITFOR DELAY 사용
다음 예에서는 로컬 변수를 WAITFOR DELAY 옵션과 함께 사용하는 방법을 보여 줍니다. 저장 프로시저는 정해진 시간 동안 변수를 기다린 다음 사용자에게 경과된 시간, 분 및 초 수 정보를 반환하도록 생성됩니다.
USE AdventureWorks; GO IF OBJECT_ID('dbo.time_delay','P') IS NOT NULL DROP PROCEDURE dbo.time_delay; GO CREATE PROCEDURE time_delay @DELAYLENGTH char(9) AS DECLARE @RETURNINFO varchar(255) BEGIN WAITFOR DELAY @DELAYLENGTH SELECT @RETURNINFO = 'A total time of ' + SUBSTRING(@DELAYLENGTH, 1, 2) + ' hours, ' + SUBSTRING(@DELAYLENGTH, 4, 2) + ' minutes, and ' + SUBSTRING(@DELAYLENGTH, 7, 2) + ' seconds ' + 'has elapsed! Your time is up.'; PRINT @RETURNINFO; END; GO -- This next statement executes the time_delay procedure. EXEC time_delay '00:00:10' GO