이벤트
이 문서의 내용
적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 미리 보기의 SQL 데이터베이스
지정된 시간 또는 시간 간격이 경과하거나 지정된 명령문이 하나 이상의 행을 수정 또는 반환할 때까지 일괄 처리, 저장 프로시저 또는 트랜잭션의 실행을 차단합니다.
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}
일괄 처리, 저장 프로시저 또는 트랜잭션이 진행되기 전에 최대 24시간까지 통과해야 하는 지정된 기간입니다.
대기할 기간입니다.
time_to_passdatetime 데이터 형식 또는 지역 변수로 지정할 수 있습니다. 날짜를 지정할 수 없으므로 datetime 값의 날짜 부분은 허용되지 않습니다.
time_to_pass 형식이 지정됩니다 hh:mm[[:ss].fff].
일괄 처리, 저장 프로시저 또는 트랜잭션이 실행되는 지정된 시간입니다.
WAITFOR 문이 완료되는 시간입니다.
time_to_execute날짜/시간 데이터 형식으로 지정하거나 지역 변수로 지정할 수 있습니다. 날짜를 지정할 수 없으므로 datetime 값의 날짜 부분은 허용되지 않습니다.
time_to_execute 형식으로 지정되며 필요에 따라 hh:mm[[:ss].fff] 날짜를 1900-01-01포함할 수 있습니다.
적용 대상: Service Broker 메시지만 해당합니다. 자세한 내용은 RECEIVE를 참조 하세요.
유효한 문입니다 RECEIVE .
적용 대상: Service Broker 메시지만 해당합니다. 자세한 내용은 GET CONVERSATION GROUP을 참조하세요.
유효한 문입니다 GET CONVERSATION GROUP .
적용 대상: Service Broker 메시지만 해당합니다. 자세한 내용은 RECEIVE 및 GET CONVERSATION GROUP을 참조하세요.
메시지가 큐에 도착하기를 대기할 시간(밀리초)을 지정합니다.
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는 이러한 시나리오를 식별하고 이러한 교착 상태가 존재할 가능성이 있는 경우 빈 결과 집합을 반환합니다.
주의
포함 WAITFOR 하면 SQL Server 프로세스 완료 속도가 느려지고 애플리케이션에서 시간 제한 메시지가 표시될 수 있습니다. 필요할 경우 애플리케이션 수준에서 연결에 대한 제한 시간 설정을 조정하세요.
다음 예제에서는 오후 10시 20분()에 데이터베이스의 sp_update_job 저장 프로시저 msdb 를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시간 지연 후에 저장 프로시저를 실행합니다.
BEGIN
WAITFOR DELAY '02:00';
EXECUTE sp_helpdb;
END;
GO
다음 예에서는 지역 변수를 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.