尽管出现错误处理,SQL代理作业在一个步骤上仍然失败

问题描述:

我的SQL Server实例具有一个代理作业Grand Master,该作业每分钟,每周7天,每天运行一次。尽管出现错误处理,SQL代理作业在一个步骤上仍然失败

我创建了另一个需要手动运行的作业。它需要做的第一件事情是禁用并停止Grand Master作业在其处于活动状态时运行。

步骤1是禁用GM,其正常工作:

exec msdb..sp_update_job @job_name = "Grand Master", @Enabled = 0 

步骤2中,但是失败。它的工作是阻止GM运行IF它正在运行。这是不应该做任何事情,如果通用汽车当前没有运行:

if exists (select 1 
      from msdb.dbo.sysjobs_view j 
      join msdb.dbo.sysjobactivity a on j.job_id = a.job_id 
      where a.run_requested_date is not null 
      and a.stop_execution_date is null 
      and j.name = 'Grand Master') 
begin 
    exec msdb.dbo.sp_stop_job 'Grand Master' 
end 

我每次运行此作业,无论通用汽车的状态,它不能在步骤2中,出现此错误:

Executed as user: NT AUTHORITY\SYSTEM. SQLServerAgent Error: Request to stop job Grand Master (from User NT AUTHORITY\SYSTEM) refused because the job is not currently running. [SQLSTATE 42000] (Error 22022). The step failed.

有没有人有任何想法?

+0

这是不是因为sp_stop_job试图停止作业,而且它没有运行?如果您不首先检查它是否正在运行,并且它是否运行sp_stop_job? – Leonidas199x

+0

感谢您的评论@ Leonidas199x'if exists ...'查询测试以查看作业是否正在运行。如果作业没有运行,那么该查询将返回一个空集,并且该步骤不应该执行任何操作并转到步骤3 – Cam

+0

只是一个建议,但您是否尝试切换这两个步骤?首先停止它,如果它正在运行,然后禁用这项工作?可能SQL Server误解了这个想法来停止一个被禁用的工作... – Tyron78

首先停止它,如果它正在运行,然后禁用该作业。 SQL Server可能会误解停止禁用作业的想法...