Sql server SQL Server-用于检测由于溢出而丢失的代理作业的TSQL

Sql server SQL Server-用于检测由于溢出而丢失的代理作业的TSQL,sql-server,tsql,sql-server-agent,Sql Server,Tsql,Sql Server Agent,我正在尝试计算TSQL,以检测作业是否超出范围并错过了下一个计划 场景:作业计划每小时运行一次(可能启用了多个计划),但由于某些原因(如网络延迟),作业停止运行10分钟,现在运行90分钟,因此错过了每小时的开始时间 有一个名为msdb.dbo.sysjobactivity的表,该表有一个名为next_scheduled_run_date的列,但此日期仅在当前运行的作业完成后更新。这与作业活动监视器的行为相同,下一个运行日期仅在当前作业完成后更新 msdb.dbo.sysjobactivity根据

我正在尝试计算TSQL,以检测作业是否超出范围并错过了下一个计划

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

有一个名为msdb.dbo.sysjobactivity的表,该表有一个名为next_scheduled_run_date的列,但此日期仅在当前运行的作业完成后更新。这与作业活动监视器的行为相同,下一个运行日期仅在当前作业完成后更新

msdb.dbo.sysjobactivity根据以下内容更新:

问题:如何根据作业运行时的当前作业开始时间计算作业的下一次计划运行。分配的计划可能不止一个


任何指点都值得欣赏。

这是一个棘手的问题。首先,您提供的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