Supervision des jobs SQL Server : vérifier la dernière exécution et la durée

Les jobs SQL Server Agent sont l’épine dorsale de la maintenance automatisée des bases de données : sauvegardes, reconstructions d’index, vérifications d’intégrité, pipelines ETL. Savoir d’un coup d’œil quand chaque job s’est exécuté pour la dernière fois et combien de temps il a duré est essentiel pour une surveillance quotidienne rapide, surtout lors de la gestion de plusieurs instances. Cette requête lit directement depuis les tables système de l’Agent dans msdb et retourne la dernière heure d’exécution et la durée de chaque job.

Comment ça fonctionne

La requête fait une jointure entre msdb..sysjobs (définitions des jobs) et msdb..sysjobhistory (historique d’exécution), trouve la dernière exécution pour chaque job, et formate la durée depuis le format entier interne de SQL Server (HHMMSS empaqueté comme entier) en une chaîne lisible HH:MM:SS. Elle retourne également la durée décomposée en minutes et secondes pour un filtrage facile.

SELECT
    job_id,
    job_name,
    run_datetime,
    SUBSTRING(run_duration, 1, 2) + ':' +
    SUBSTRING(run_duration, 3, 2) + ':' +
    SUBSTRING(run_duration, 5, 2)                           AS run_duration_hms,
    CONVERT(INT, SUBSTRING(run_duration, 1, 2)) * 60 +
    CONVERT(INT, SUBSTRING(run_duration, 3, 2))             AS duration_min,
    CONVERT(FLOAT, SUBSTRING(run_duration, 5, 2))           AS duration_sec
FROM
(
    SELECT
        j.job_id,
        j.name AS job_name,
        DATEADD(hh, -7, run_datetime) AS run_datetime,
        run_duration = RIGHT('000000' + CONVERT(VARCHAR(6), h.run_duration), 6)
    FROM
    (
        SELECT
            j.name AS job_name,
            run_datetime = MAX(
                CONVERT(DATETIME, RTRIM(run_date)) +
                (run_time * 9 + run_time % 10000 * 6 + run_time % 100 * 10) / 216e4
            )
        FROM msdb..sysjobhistory h
        INNER JOIN msdb..sysjobs j ON h.job_id = j.job_id
        GROUP BY j.name
    ) t
    INNER JOIN msdb..sysjobs j        ON t.job_name = j.name
    INNER JOIN msdb..sysjobhistory h
        ON  j.job_id = h.job_id
        AND t.run_datetime = CONVERT(DATETIME, RTRIM(h.run_date)) +
            (h.run_time * 9 + h.run_time % 10000 * 6 + h.run_time % 100 * 10) / 216e4
) dt
-- Décommenter pour filtrer par job spécifique :
-- WHERE job_id = @job_id
ORDER BY run_datetime DESC;

Le décalage DATEADD(hh, -7, ...) ajuste pour un fuseau horaire UTC+7 — supprimez-le ou ajustez-le selon la configuration de fuseau horaire de votre serveur. Pour filtrer les jobs qui ont duré plus longtemps que prévu, ajoutez une clause WHERE duration_min > N.