2016-02-25 70 views
1

我正在尝试计算TSQL以检测作业是否已超出并错过了其下一个计划。SQL Server-TSQL检测由于溢出而导致错过的代理作业

场景:作业计划为每小时运行一次(可能启用多个计划),但由于某些原因(如网络延迟),作业停止10分钟,现在运行90分钟,因此缺少这是每小时开始。

有一个名为msdb.dbo.sysjobactivity的表,它有一个名为next_scheduled_run_date的列,但此日期仅在当前正在运行的作业完成后才会更新。这与作业活动监视器的行为相同,下一个运行日期仅在当前作业完成后更新。基于当前作业的作业运行时开始时间我如何计算作业的下一次计划运行,:

msdb.dbo.sysjobactivity更新为在每个细节:https://dba.stackexchange.com/questions/22644/how-and-when-does-sql-agent-update-next-run-date-next-run-time-values

问题。可能会分配不止一个时间表。

任何指针赞赏。

回答

1

这是一个棘手的问题。首先你包含的stackexchange链接非常好。我遵循了这一点,并且做了我自己的追踪。下面的代码将使您朝着正确的方向发展。你可能需要做详细的测试,我发现当答案是同一分钟,但秒数稍微偏离时,我遇到了一些计时问题。你当然可以根据需要进行修改。

这里是代码的第一稿应该把你在正确的方向

declare @jobname [sysname] = 'Check' 
Select 
    nextOne = min(
     case freq_subday_type 
      when 8 then dateadd(hour , (Datediff(hour , [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time), getdate())/freq_subday_interval + 1) * freq_subday_interval, [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time)) 
      when 4 then dateadd(minute, (Datediff(minute, [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time), getdate())/freq_subday_interval + 1) * freq_subday_interval, [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time)) 
      when 2 then dateadd(second, (Datediff(minute, [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time), getdate())/freq_subday_interval + 1) * freq_subday_interval, [dbo].[agent_datetime](sjs.next_run_date, sjs.next_run_time)) 
     end) 
FROM msdb.[dbo].[sysschedules] ss 
inner join msdb.[dbo].[sysjobschedules] sjs on ss.schedule_id = sjs.schedule_id 
inner join msdb.[dbo].[sysjobs] sj on sjs.job_id = sj.job_id 
where sj.Name = @jobname and ss.enabled = 1