我正在从 SSRS 调用 SQL 代理作业并使用参数来确定要运行的作业。
我可以很好地运行这项工作。我要做的是根据工作状态向用户返回一条消息。
以下是它的执行方式:
IF @Job = 'Run'
BEGIN
EXEC msdb.dbo.sp_start_job 'Run selected job'
END
IF @Job = 'Delete Previous Run' AND @Confirm = 'DELETE'
BEGIN
EXEC msdb.dbo.sp_start_job 'Delete Previous Run'
END
当我PRINT
在语句之后放入代码EXEC
时,唯一返回的是Job '<job name>' completed successfully
我希望在作业完成后立即返回 SQL 代理状态。我怎样才能做到这一点?
该
sp_start_job
过程启动作业,然后在作业异步运行时返回给您。它不会等待作业运行——只需启动它并离开。如果你想让你的 SQL 坐下来等待作业运行,你需要在你的 T-SQL 中引入一个循环
WAITFOR DELAY 'HH:MI:SS'
,然后检查作业状态,然后重复直到作业达到可以返回的终端状态给用户。sp_help_job
将为您提供作业状态,但它使用#temp
表,如果您尝试自己将结果sp_help_job
插入临时表,这可能会导致代码出现问题,您将遇到错误 8164,“无法嵌套 INSERT EXEC 语句。” 有些人会使用xp_sqlagent_enum_jobs
一个未记录的内部过程,它会返回类似的结果。但是,因为它没有文档化,我不希望在生产代码中使用它,因为行为可能会在 SQL Server 的未来版本或 CU 中发生变化。相反,我更喜欢直接在 msdb 中查询表以确定作业状态。
每次围绕该循环,您都会执行以下操作来获取作业状态(或从我的开源 DBA 数据库中获取函数,我将在我的博客文章中进一步描述):