У мене є кілька завдань агента SQL Server, які повинні виконуватися послідовно. Щоб зберегти хороший огляд завдань, які слід виконати, я створив основне завдання, яке викликає інші завдання з викликом EXEC msdb.dbo.sp_start_job N'TEST1'
. В sp_start_job
обробки миттєво (Job Step 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 , тому що я зосереджувався на вдосконаленні коду. Все-таки дійсний. Але я здогадуюсь, що люди тут взагалі мають розумніші речі сказати, чому я не повинен намагатися робити це так, як я я зараз це роблю або пропоную хороші альтернативи.)
EDIT (25 липня)
Мабуть, в моєму сценарії не так вже й неправильно, згідно з низькою кількістю відповідей, що вказують на проблеми з ним :-) Альтернативою цьому сценарію, як видається, є використання інструменту, призначеного для цього завдання (на зразок SQL Sentry Event Manager або ...) - або написати такий інструмент самостійно. Ми не будемо купувати такий інструмент у моєї нинішньої компанії, тому поки що я просто дотримуюся сценарію.