2016-02-25 4 views
1

Я пытаюсь разработать TSQL, чтобы определить, переопределило ли JOB и пропустило его следующее расписание.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 

 Смежные вопросы

  • Нет связанных вопросов^_^