我有几个应顺序运行的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上发布了这个问题,因为我一直专注于代码的改进。仍然有效。但是我的猜测是,这里的人们通常会有更聪明的话来说明为什么我不应该尝试这样做我现在就这样做,或提供其他不错的选择。)
编辑(7月25日)
,根据指出存在问题的答案的数量少,显然我的脚本没有太多错误:-)这种脚本的替代方法似乎是使用一种针对这些问题的工具任务(例如SQL Sentry Event Manager或...)-或自己编写此类工具。我们不会在目前的公司购买这样的工具,所以现在我只坚持使用脚本。