У меня есть несколько заданий агента SQL Server, которые должны выполняться последовательно. Чтобы иметь хороший обзор работ, которые должны быть выполнены, я создал основную работу, которая вызывает другие работы с вызовом EXEC msdb.dbo.sp_start_job N'TEST1'
. Завершение происходит sp_start_job
мгновенно (шаг работы 1), но затем я хочу, чтобы моя основная работа ждала, пока работа TEST1
не будет завершена, прежде чем вызвать следующую работу.
Итак, я написал этот небольшой скрипт, который начинает выполняться сразу после вызова задания (шаг задания 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 , потому что сосредоточился на улучшении кода. Все еще в силе. Но я полагаю, что люди здесь, в общем, будут умнее говорить о том, почему я не должен пытаться делать это так, как я » Я делаю это сейчас, или предоставить хорошие альтернативы.)
РЕДАКТИРОВАТЬ (25 июля)
По-видимому, с моим сценарием не так уж и много проблем, в связи с небольшим количеством ответов, указывающих на проблемы с ним :-) Альтернативой этому виду сценариев является использование инструмента, предназначенного для этих задач. задачи (например, SQL Sentry Event Manager или ...) - или написать такой инструмент самостоятельно. Мы не будем покупать такой инструмент в моей нынешней компании, поэтому сейчас я просто буду придерживаться сценария.