2016-02-25 72 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