I have N jobs with M steps in each, that could change any time(Add/delete some steps). Jobs have different schedule to run. I want a query to get last run status, job id, job name of each job. Is it right way to do this scenario by (Job outcome)
?
Advertisement
Answer
This is the query I use (a little tuned) to check job status. This variation will select the last job outcome
for each job.
SELECT JobName = J.name, H.* FROM msdb.dbo.sysjobs AS J CROSS APPLY ( SELECT TOP 1 JobName = J.name, StepNumber = T.step_id, StepName = T.step_name, StepStatus = CASE T.run_status WHEN 0 THEN 'Failed' WHEN 1 THEN 'Succeeded' WHEN 2 THEN 'Retry' WHEN 3 THEN 'Canceled' ELSE 'Running' END, ExecutedAt = msdb.dbo.agent_datetime(T.run_date, T.run_time), ExecutingHours = ((T.run_duration/10000 * 3600 + (T.run_duration/100) % 100 * 60 + T.run_duration % 100 + 31 ) / 60) / 60, ExecutingMinutes = ((T.run_duration/10000 * 3600 + (T.run_duration/100) % 100 * 60 + T.run_duration % 100 + 31 ) / 60) % 60, Message = T.message FROM msdb.dbo.sysjobhistory AS T WHERE T.job_id = J.job_id ORDER BY T.instance_id DESC) AS H ORDER BY J.name
If you change the TOP 1
for TOP 2
, then you will also see the last step executed, aside from the job outcome
.