Une requête pour lister tous les travaux de l’Agent SQL Server avec leur caractéristiques d’exécution

Voici une requête qui permet de lister tous les jobs existant sur une instance SQL Server :

– toutes leurs étapes
– la définition de ces étapes (appel à une procédure stockée, exécution d’un package SSIS, …)
– la date et l’heure de la prochaine fois que le job sera exécuté
– la fréquence à laquelle l’exécution du job est planifiée, si le job a une planification
– la date à laquelle le job job a été créé, et à laquelle il a été modifié pour la dernière fois

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
-------------------------------
-- Nicolas Souquet - 30/07/2012
-------------------------------
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO
 
SELECT    J.name AS job_name
    , JS.step_name
    , JS.command
    , JS.database_name AS database_context
    , NR.next_run_date_time
    , CASE J.enabled WHEN 1 THEN 'YES' ELSE 'NO' END AS job_is_enabled
    , CASE S.enabled WHEN 1 THEN 'YES' ELSE 'NO' END AS job_is_scheduled
    , SP.name AS owner_login_name
    , CASE S.freq_type
      WHEN 1 THEN 'Once'
      WHEN 4 THEN 'Daily'
      WHEN 8 THEN 'Weekly'
      WHEN 16 THEN 'Monthly'
      WHEN 32 THEN 'Monthly relative'
      WHEN 64 THEN 'When SQL Server Agent starts'
      WHEN 128 THEN 'Start whenever the CPU(s) become idle'
    END AS frenquency
    , CASE S.freq_type
      WHEN 1 THEN 'One time only'
      WHEN 4 THEN 'Every ' + CASE CONVERT(varchar, S.freq_interval) WHEN '1' THEN 'day' ELSE 'days' END
      WHEN 8 THEN 'Every ' + CASE CONVERT(varchar, S.freq_recurrence_factor) WHEN '1' THEN 'week' ELSE 'weeks' END + ' on ' + D.freq_day_concat
      WHEN 16 THEN 'Day ' + CONVERT(varchar, S.freq_interval) + ' of every '
        + CASE CONVERT(varchar, S.freq_recurrence_factor) WHEN '1' THEN ' month' ELSE ' months' END
      WHEN 32 THEN 'The ' + CASE S.freq_relative_interval
              WHEN 1 THEN 'first'
              WHEN 2 THEN 'second'
              WHEN 4 THEN 'third'
              WHEN 8 THEN 'fourth'
              WHEN 16 THEN 'last'
            END
            + ' '
            + CASE S.freq_interval
              WHEN 1 THEN 'Sunday'
              WHEN 2 THEN 'Monday'
              WHEN 3 THEN 'Tuesday'
              WHEN 4 THEN 'Wednesday'
              WHEN 5 THEN 'Thursday'
              WHEN 6 THEN 'Friday'
              WHEN 7 THEN 'Saturday'
              WHEN 8 THEN 'Day'
              WHEN 9 THEN 'Weekday'
              WHEN 10 THEN 'Weekend Day'
            END
            + ' of every '
            + CASE CONVERT(varchar, S.freq_recurrence_factor) WHEN '1' THEN ' month' ELSE ' months' END
    END + CASE S.freq_subday_type
      WHEN 1 THEN ', once, at ' + AT.start_time
      WHEN 2 THEN ', every ' + CONVERT(varchar(10), S.freq_subday_interval)
          + ' seconds, starting at ' + AT.start_time
          + ' ending at '  + AT.end_time
      WHEN 4 THEN ', every ' + CONVERT(varchar(10), S.freq_subday_interval) + ' minutes, from '
          + AT.start_time + ', to ' + AT.end_time
      WHEN 8 THEN ', every ' + CONVERT(varchar(10), S.freq_subday_interval) + ' hours, starting at '
          + AT.start_time + ', ending at ' + AT.end_time
    END AS frequency_detail
    , CASE
      WHEN S.freq_type = 1 THEN 'On date: ' + AD.active_start_date + ' At time: '
              + AT.start_time
      WHEN S.freq_type < 64 THEN 'Start date: ' + AD.active_start_date +
              + CASE AD.active_end_date
                WHEN '31/12/9999' THEN ' - No end date'  
                ELSE ' - End date: ' + AD.active_end_date  
              END
    END AS date_range
    , CASE C.name WHEN '[Uncategorized (Local)]' THEN 'Uncategorized' ELSE C.name END AS job_category_name
    , J.description AS job_description
    , J.date_created  
    , J.date_modified
FROM    msdb.dbo.sysjobs AS J
INNER JOIN  msdb.dbo.sysjobsteps AS JS
      ON J.job_id = JS.job_id
INNER JOIN  msdb.dbo.sysjobschedules AS JSCH
      ON J.job_id = JSCH.job_id
INNER JOIN  msdb.dbo.sysschedules AS S
      ON JSCH.schedule_id = S.schedule_id
INNER JOIN  msdb.dbo.syscategories AS C
      ON J.category_id = C.category_id
LEFT JOIN  sys.server_principals AS SP
      ON SP.sid = J.owner_sid
OUTER APPLY  (
      SELECT  freq_day + ', '
      FROM  (
          SELECT CASE WHEN S.freq_interval & 1 = 1 THEN 'Sunday' ELSE '' END AS freq_day
          UNION ALL SELECT CASE WHEN S.freq_interval & 2 = 2 THEN 'Monday' ELSE '' END
          UNION ALL SELECT CASE WHEN S.freq_interval & 4 = 4 THEN 'Tuesday' ELSE '' END
          UNION ALL SELECT CASE WHEN S.freq_interval & 8 = 8 THEN 'Wednesday' ELSE '' END
          UNION ALL SELECT CASE WHEN S.freq_interval & 16 = 16 THEN 'Thursday' ELSE '' END
          UNION ALL SELECT CASE WHEN S.freq_interval & 32 = 32 THEN 'Friday' ELSE '' END
          UNION ALL SELECT CASE WHEN S.freq_interval & 64 = 64 THEN 'Saturday' ELSE '' END
        ) AS S
      WHERE  LEN(freq_day) > 0
      FOR  XML PATH ('')
    ) AS D (freq_day_concat)
OUTER APPLY  (
      SELECT  STUFF(STUFF(REPLICATE('0', 6 - LEN(S.active_start_time))  
          + CAST(S.active_start_time AS varchar(6)), 3, 0, ':'), 6, 0, ':') AS start_time
        , STUFF(STUFF(REPLICATE('0', 6 - LEN(S.active_end_time))  
          + CAST(S.active_end_time AS varchar(6)), 3, 0, ':'), 6, 0, ':') AS end_time
    ) AS AT
OUTER APPLY  (
      SELECT  CONVERT(char(10), CAST(CAST(S.active_start_date AS char(8)) AS date), 103) AS active_start_date
        , CONVERT(char(10), CAST(CAST(S.active_end_date AS char(8)) AS date), 103) AS active_end_date
    ) AS AD
OUTER APPLY  (
      SELECT  CAST(NULLIF(JSCH.next_run_date, 0) AS char(8)) + ' '
        + STUFF(STUFF(REPLICATE('0', 6 - LEN(JSCH.next_run_time)) + CAST(JSCH.next_run_time AS char(6)), 3, 0, ':'), 6, 0, ':') AS next_run_date_time
    ) AS NR
WHERE    1 = 1
--AND    J.name LIKE '%unMot%'
--AND    JS.database_name = 'uneBD'
--AND    J.enabled  = 1
ORDER BY  J.name, JS.step_id

Bonne planification de job à tous !

ElSüket ;)

Laisser un commentaire