순차적으로 실행해야하는 여러 SQL Server 에이전트 작업이 있습니다. 실행해야 할 작업에 대한 좋은 개요를 유지하기 위해을 호출하여 다른 작업을 호출하는 기본 작업을 만들었습니다 EXEC msdb.dbo.sp_start_job N'TEST1'
. sp_start_job
작업이 될 때까지 즉시 완료 (작업 1 단계),하지만 그때 대기에 내 주요 작업을하려면 TEST1
다음 작업을 호출하기 전에 완료했습니다.
따라서 작업이 호출 된 직후 (Job Step 2) 실행을 시작하고 하위 작업이 완료 될 때까지 기본 작업을 대기시키는이 작은 스크립트를 작성했습니다.
WHILE 1 = 1
BEGIN
WAITFOR DELAY '00:05:00.000';
SELECT *
INTO #jobs
FROM OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;',
'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'',
@execution_status = 0, @job_aspect = N''JOB''');
IF NOT (EXISTS (SELECT top 1 * FROM #jobs))
BEGIN
BREAK
END;
DROP TABLE #jobs;
END;
이것은 충분히 잘 작동합니다. 그러나 더 똑똑하고 안전한 WHILE 1 = 1
솔루션이 가능해야한다는 느낌이 들었습니다 .
다음 사항이 궁금합니다. 몇 가지 통찰력을 제공해 주시기 바랍니다.
- 이 접근법의 문제점은 무엇입니까?
- 더 좋은 방법을 제안 할 수 있습니까?
( 코드 개선에 중점을 두었 기 때문에 StackOverflow 에이 질문을 먼저 게시했습니다 . 여전히 유효합니다. 그러나 제 사람들은 일반적으로 여기 사람들이 내가 왜 그렇게하지 말아야하는지에 대해 더 똑똑하게 말할 것이라고 생각합니다 지금하고 있거나 좋은 대안을 제시하십시오.)
편집 (7 월 25 일)
분명히 스크립트에 문제가 있음을 나타내는 적은 수의 답변에 따라 내 스크립트에는 너무 많은 잘못이 없습니다 :-) 이러한 종류의 스크립팅에 대한 대안은 이들을 위해 설계된 도구를 사용하는 것 같습니다 작업 (예 : SQL Sentry Event Manager 또는 ...)-이러한 도구를 직접 작성하십시오. 우리는 현재 회사에서 그러한 도구를 구매하지 않을 것이므로 지금은 스크립트를 사용합니다.