我有几个应该按顺序运行的 SQL Server 代理作业。为了对应该执行的作业有一个很好的概述,我创建了一个主作业,它通过调用EXEC msdb.dbo.sp_start_job N'TEST1'
. 立即完成(作业步骤 1),但我希望我的sp_start_job
主要作业等到作业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
?)的解决方案应该是可能的。
我对以下事情感到好奇,希望您能给我一些见解:
- 这种方法有什么问题?
- 你能建议一个更好的方法来做到这一点吗?
(我也在dba.stackexchange.com上发布了这个问题,也是为了从少编程多 dba 的观点中获利。)