我有几个应该按顺序运行的 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;
Run Code Online (Sandbox Code Playgroud)
这工作得很好。但我觉得更聪明和/或更安全(WHILE 1 = 1
?)的解决方案应该是可能的。
我对以下事情很好奇,希望你能给我一些见解:
(我首先在StackOverflow 上发布了这个问题,因为我专注于改进代码。仍然有效。但我的猜测是,这里的人们通常会更聪明地说出为什么我不应该像我那样尝试这样做”我现在就做,或者提供好的替代方案。)
编辑(7 月 25 日)
显然我的脚本没有太多错误,根据指出它问题的答案数量很少:-) 这种脚本的替代方法似乎是使用专为这些设计的工具任务(如 SQL Sentry 事件管理器或...) - …