Estou usando um ambiente SQL Server 2008 Sp3.
Tenho uma consulta que retorna informações sobre trabalhos com falha nos últimos 10 minutos. Se um trabalho tiver dois agendadores (por exemplo - um trabalho executado a cada 10 minutos pela manhã e a cada 30 minutos no restante do dia), a consulta retornará duas linhas. Você pode me ajudar a corrigir a consulta para que ela retorne apenas a linha relevante do agendador relevante que foi usado?
A consulta que estou usando está colada abaixo:
SELECT h.server
,j.name
,h.step_id
,h.step_name
,h.message
,h.run_status
,Rundatetime = CONVERT(DATETIME, CONVERT(CHAR(8), run_date, 112) + ' ' + STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), run_time), 6), 5, 0, ':'), 3, 0, ':'), 121)
,h.run_duration
,s.last_outcome_message
,sc.name AS ScheduleName
,s.last_run_time
,sjc.next_run_time
FROM msdb..sysjobhistory h
INNER JOIN msdb..sysjobs j ON h.job_id = j.job_id
INNER JOIN msdb..sysjobservers s ON s.job_id=h.job_id
LEFT OUTER JOIN msdb..sysjobschedules sjc ON sjc.job_id=h.job_id
LEFT OUTER JOIN msdb..sysschedules sc ON sc.schedule_id=sjc.schedule_id
WHERE run_status=0
AND step_name<>'(Job outcome)'
--Looking on failed job from the last 10 minutes.
AND CONVERT(DATETIME, CONVERT(CHAR(8), run_date, 112) + ' ' + STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), run_time), 6), 5, 0, ':'), 3, 0, ':'), 121) > DATEADD(mi, -10, GETDATE())
ORDER BY h.run_date DESC ,h.run_time DESC
Desde já obrigado, Rony.
Isso é meio chato, mas já é um começo...
Extraí o ID do agendamento do campo [last_outcome_message] e o juntei ao ID do agendamento. Isso deve fornecer o conjunto de resultados correto
Não consegui encontrar nenhum outro lugar onde o schedule_id esteja armazenado em um evento de histórico.
Fazendo um min em sjc.next_run_time deve resolver.
Uma abordagem mais simples não seria procurar a etapa do resultado do trabalho? A coluna de mensagem informará o que invocou o trabalho.