Si la visionneuse du journal est pratique pour voir l’historique des exécutions d’un job, comment peut-on voir s’il existe des jobs dont l’exécution a échoué (ou réussi) pour pouvoir l’encapsuler dans une application ou un rapport SSRS par exemple ?
Les tables système de la base de données MSDB nous permettent de spécifier une requête nous permettant de retrouver tous les informations dont nous avons besoin à propos des jobs :
– msdb.dbo.sysjobs stocke la liste de tous les jobs présents sur l’instance, qu’ils soient activés ou non
– msdb.dbo.sysjobhistory stocke la liste de toutes les exécutions des jobs et de leurs étapes
– msdb.dbo.sysjobsteps stocke la description de toutes les étapes de tous les jobs de l’instance
Voici donc, par exemple, comment retrouver tous les échecs pour le job nommé ‘TEST’, avec leur date :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | --------------------------------- -- Nicolas SOUQUET - 24/07/2009 - --------------------------------- SELECT nomJob, CAST(STUFF(STUFF(runDateTime, 12, 0, ':'), 15, 0, ':') AS DATETIME) AS DateEchecExecJob FROM ( SELECT J.name AS nomJob, CAST(H.run_date AS CHAR(8)) + ' ' + CASE LEN(CAST(H.run_time AS VARCHAR(6))) WHEN 5 THEN '0' + CAST(H.run_time AS CHAR(5)) ELSE CAST(H.run_time AS CHAR(6)) END AS runDateTime FROM msdb.dbo.sysjobs J JOIN msdb.dbo.sysjobhistory H ON J.job_id = H.job_id WHERE J.name = 'TEST' AND J.enabled = 1 -- Le job est activé AND H.run_status = 0 -- 0 : Echec | 1 : Réussite AND H.step_id = 0 -- quelle que soit l'étape du job ) AS JOB_FAILED_EXEC (nomJob, runDateTime) |
Et si l’on veut être relativement complet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | --------------------------------- -- Nicolas SOUQUET - 24/07/2009 - --------------------------------- SELECT nomJob , nomEtapeJob , numeroEtapeJob , msgEtape , CAST(STUFF(STUFF(dateExecutionEtape, 12, 0, ':'), 15, 0, ':') AS DATETIME) AS dateExecutionEtape , dureeExecutionEtape , statutExecutionEtape FROM ( SELECT J.name AS nomJob , S.step_name AS nomEtapeJob , S.step_id AS numeroEtapeJob , ISNULL('Erreur : ' + M.description, H.message) AS msgEtape , CAST(H.run_date AS CHAR(8)) + ' ' + CASE LEN(CAST(H.run_time AS VARCHAR(6))) WHEN 1 THEN '00000' + CAST(H.run_time AS CHAR(1)) WHEN 2 THEN '0000' + CAST(H.run_time AS CHAR(2)) WHEN 3 THEN '000' + CAST(H.run_time AS CHAR(3)) WHEN 4 THEN '00' + CAST(H.run_time AS CHAR(4)) WHEN 5 THEN '0' + CAST(H.run_time AS CHAR(5)) ELSE CAST(H.run_time AS CHAR(6)) END AS dateExecutionEtape , CASE LEN(CAST(H.run_duration AS VARCHAR(10))) WHEN 1 THEN '00:00:0' + CAST(H.run_duration AS CHAR(1)) WHEN 2 THEN '00:00:' + CAST(H.run_duration AS CHAR(2)) WHEN 3 THEN '00:0' + STUFF(CAST(H.run_duration AS CHAR(3)), 2, 0, ':') WHEN 4 THEN '00:' + STUFF(CAST(H.run_duration AS CHAR(4)), 3, 0, ':') WHEN 5 THEN '0' + STUFF(STUFF(CAST(H.run_duration AS CHAR(5)), 2, 0, ':'), 5, 0, ':') WHEN 6 THEN STUFF(STUFF(CAST(H.run_duration AS CHAR(6)), 3, 0, ':'), 6, 0, ':') END AS dureeExecutionEtape , CASE H.run_status WHEN 0 THEN 'FAILED' WHEN 1 THEN 'SUCCESS' WHEN 2 THEN 'RETRY' WHEN 3 THEN 'CANCELED' WHEN 4 THEN 'RUNNING' -- Pas fiable END AS statutExecutionEtape FROM msdb.dbo.sysjobs AS J INNER JOIN msdb.dbo.sysjobsteps AS S ON J.job_id = S.job_id INNER JOIN msdb.dbo.sysjobhistory AS H ON S.job_id = H.job_id AND S.step_id = H.step_id LEFT JOIN sys.sysmessages AS M ON H.sql_message_id = M.error ) AS JOB_CHARACTERISTICS (nomJob, nomEtapeJob, numeroEtapeJob, msgEtape, dateExecutionEtape, dureeExecutionEtape, statutExecutionEtape) |
ElSuket
Bonjour,
Pouvez-vous essayer sans le « sys. » qui précède « sysmessages »? Je n’ai pas d’instance SQL Server 2000 sous la main pour tester …
N’hésitez pas à donner le label de l’erreur
@++
Bonjour,
Merci pour ton script.
Je suis débutant sous sql server. La version complete marche très bien sous sql server 2008 mais sous sql server 2000 j’ai un message d’erreur sur sysmessages ?
Comment pourrais je résoudre ce problème.
Merci