Google Custom Search

Thursday, March 26, 2009

Job Schedule Information for SQL Server 2005

SELECT
   @@servername as [Server], msdb.dbo.sysjobs.name as [Name]
  , CASE
       WHEN msdb.dbo.sysjobs.enabled = 0 THEN 'Disabled'
       WHEN msdb.dbo.sysjobs.job_id IS NULL THEN 'Unscheduled'
       WHEN msdb.dbo.sysschedules.freq_type = 0x1 -- OneTime
           THEN
               'Once on '
             + CONVERT(
                          CHAR(10)
                        , CAST( CAST( msdb.dbo.sysschedules.active_start_date AS VARCHAR ) AS DATETIME )
                        , 102 -- yyyy.mm.dd
                      )
       WHEN msdb.dbo.sysschedules.freq_type = 0x4 -- Daily
           THEN 'Daily'
       WHEN msdb.dbo.sysschedules.freq_type = 0x8 -- weekly
           THEN
               CASE
                   WHEN msdb.dbo.sysschedules.freq_recurrence_factor = 1
                       THEN 'Weekly on '
                   WHEN msdb.dbo.sysschedules.freq_recurrence_factor > 1
                       THEN 'Every '
                          + CAST( msdb.dbo.sysschedules.freq_recurrence_factor AS VARCHAR )
                          + ' weeks on '
               END
             + LEFT(
                         CASE WHEN msdb.dbo.sysschedules.freq_interval &  1 =  1 THEN 'Sunday, '    ELSE '' END
                       + CASE WHEN msdb.dbo.sysschedules.freq_interval &  2 =  2 THEN 'Monday, '    ELSE '' END
                       + CASE WHEN msdb.dbo.sysschedules.freq_interval &  4 =  4 THEN 'Tuesday, '   ELSE '' END
                       + CASE WHEN msdb.dbo.sysschedules.freq_interval &  8 =  8 THEN 'Wednesday, ' ELSE '' END
                       + CASE WHEN msdb.dbo.sysschedules.freq_interval & 16 = 16 THEN 'Thursday, '  ELSE '' END
                       + CASE WHEN msdb.dbo.sysschedules.freq_interval & 32 = 32 THEN 'Friday, '    ELSE '' END
                       + CASE WHEN msdb.dbo.sysschedules.freq_interval & 64 = 64 THEN 'Saturday, '  ELSE '' END
                     , LEN(
                                CASE WHEN msdb.dbo.sysschedules.freq_interval &  1 =  1 THEN 'Sunday, '    ELSE '' END
                              + CASE WHEN msdb.dbo.sysschedules.freq_interval &  2 =  2 THEN 'Monday, '    ELSE '' END
                              + CASE WHEN msdb.dbo.sysschedules.freq_interval &  4 =  4 THEN 'Tuesday, '   ELSE '' END
                              + CASE WHEN msdb.dbo.sysschedules.freq_interval &  8 =  8 THEN 'Wednesday, ' ELSE '' END
                              + CASE WHEN msdb.dbo.sysschedules.freq_interval & 16 = 16 THEN 'Thursday, '  ELSE '' END
                              + CASE WHEN msdb.dbo.sysschedules.freq_interval & 32 = 32 THEN 'Friday, '    ELSE '' END
                              + CASE WHEN msdb.dbo.sysschedules.freq_interval & 64 = 64 THEN 'Saturday, '  ELSE '' END
                          ) - 1  -- LEN() ignores trailing spaces
                   )
       WHEN msdb.dbo.sysschedules.freq_type = 0x10 -- monthly
           THEN
               CASE
                   WHEN msdb.dbo.sysschedules.freq_recurrence_factor = 1
                       THEN 'Monthly on the '
                   WHEN msdb.dbo.sysschedules.freq_recurrence_factor > 1
                       THEN 'Every '
                          + CAST( msdb.dbo.sysschedules.freq_recurrence_factor AS VARCHAR )
                          + ' months on the '
               END
             + CAST( msdb.dbo.sysschedules.freq_interval AS VARCHAR )
             + CASE
                   WHEN msdb.dbo.sysschedules.freq_interval IN ( 1, 21, 31 ) THEN 'st'
                   WHEN msdb.dbo.sysschedules.freq_interval IN ( 2, 22     ) THEN 'nd'
                   WHEN msdb.dbo.sysschedules.freq_interval IN ( 3, 23     ) THEN 'rd'
                   ELSE 'th'
               END
       WHEN msdb.dbo.sysschedules.freq_type = 0x20 -- monthly relative
           THEN
               CASE
                   WHEN msdb.dbo.sysschedules.freq_recurrence_factor = 1
                       THEN 'Monthly on the '
                   WHEN msdb.dbo.sysschedules.freq_recurrence_factor > 1
                       THEN 'Every '
                          + CAST( msdb.dbo.sysschedules.freq_recurrence_factor AS VARCHAR )
                          + ' months on the '
               END
             + CASE msdb.dbo.sysschedules.freq_relative_interval
                   WHEN 0x01 THEN 'first '
                   WHEN 0x02 THEN 'second '
                   WHEN 0x04 THEN 'third '
                   WHEN 0x08 THEN 'fourth '
                   WHEN 0x10 THEN 'last '
               END
             + CASE msdb.dbo.sysschedules.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 'week day'
                   WHEN 10 THEN 'weekend day'
               END
       WHEN msdb.dbo.sysschedules.freq_type = 0x40
           THEN 'Automatically starts when SQLServerAgent starts.'
       WHEN msdb.dbo.sysschedules.freq_type = 0x80
           THEN 'Starts whenever the CPUs become idle'
       ELSE ''
   END
 + CASE
       WHEN msdb.dbo.sysjobs.enabled = 0 THEN ''
       WHEN msdb.dbo.sysjobs.job_id IS NULL THEN ''
       WHEN msdb.dbo.sysschedules.freq_subday_type = 0x1 OR msdb.dbo.sysschedules.freq_type = 0x1
           THEN ' at '
             + CASE
                   WHEN msdb.dbo.sysschedules.active_start_time =      0 THEN '12:00'
                   WHEN msdb.dbo.sysschedules.active_start_time = 120000 THEN '12:00'
                   WHEN msdb.dbo.sysschedules.active_start_time <>
                       THEN STUFF(
                                     LEFT( CAST ( msdb.dbo.sysschedules.active_start_time AS VARCHAR ), 3 )
                                   , 2
                                   , 0
                                   , ':'
                                 )
                   WHEN msdb.dbo.sysschedules.active_start_time <>
                       THEN STUFF(
                                     LEFT( CAST ( msdb.dbo.sysschedules.active_start_time AS VARCHAR ), 4 )
                                   , 3
                                   , 0
                                   , ':'
                                 )
                   WHEN msdb.dbo.sysschedules.active_start_time <>
                       THEN STUFF(
                                     LEFT( CAST ( msdb.dbo.sysschedules.active_start_time - 120000 AS VARCHAR ), 3 )
                                   , 2
                                   , 0
                                   , ':'
                                 )
                   ELSE STUFF(
                                 LEFT( CAST ( msdb.dbo.sysschedules.active_start_time - 120000 AS VARCHAR ), 4 )
                               , 3
                               , 0
                               , ':'
                             )
               END
             + CASE
                   WHEN msdb.dbo.sysschedules.active_start_time <>
                   ELSE ' PM'
               END
       WHEN msdb.dbo.sysschedules.freq_subday_type IN ( 0x2, 0x4, 0x8 )
           THEN ' every '
             + CAST( msdb.dbo.sysschedules.freq_subday_interval AS VARCHAR )
             + CASE freq_subday_type
                   WHEN 0x2 THEN ' second'
                   WHEN 0x4 THEN ' minute'
                   WHEN 0x8 THEN ' hour'
               END
             + CASE
                   WHEN msdb.dbo.sysschedules.freq_subday_interval > 1 THEN 's'
               END
       ELSE ''
   END
 + CASE
       WHEN msdb.dbo.sysjobs.enabled = 0 THEN ''
       WHEN msdb.dbo.sysjobs.job_id IS NULL THEN ''
       WHEN msdb.dbo.sysschedules.freq_subday_type IN ( 0x2, 0x4, 0x8 )
           THEN ' between '
             + CASE
                   WHEN msdb.dbo.sysschedules.active_start_time =      0 THEN '12:00'
                   WHEN msdb.dbo.sysschedules.active_start_time = 120000 THEN '12:00'
                   WHEN msdb.dbo.sysschedules.active_start_time <>
                       THEN STUFF(
                                     LEFT( CAST ( msdb.dbo.sysschedules.active_start_time AS VARCHAR ), 3 )
                                   , 2
                                   , 0
                                   , ':'
                                 )
                   WHEN msdb.dbo.sysschedules.active_start_time <>
                       THEN STUFF(
                                     LEFT( CAST ( msdb.dbo.sysschedules.active_start_time AS VARCHAR ), 4 )
                                   , 3
                                   , 0
                                   , ':'
                                 )
                   WHEN msdb.dbo.sysschedules.active_start_time <>
                       THEN STUFF(
                                     LEFT( CAST ( msdb.dbo.sysschedules.active_start_time - 120000 AS VARCHAR ), 3 )
                                   , 2
                                   , 0
                                   , ':'
                                 )
                   ELSE STUFF(
                                 LEFT( CAST ( msdb.dbo.sysschedules.active_start_time - 120000 AS VARCHAR ), 4 )
                               , 3
                               , 0
                               , ':'
                             )
               END
             + CASE
                   WHEN msdb.dbo.sysschedules.active_start_time <>
                   ELSE ' PM'
               END
             + ' and '
             + CASE
                   WHEN msdb.dbo.sysschedules.active_end_time =      0 THEN '12:00'
                   WHEN msdb.dbo.sysschedules.active_end_time = 120000 THEN '12:00'
                   WHEN msdb.dbo.sysschedules.active_end_time <>
                       THEN STUFF(
                                     LEFT( CAST ( msdb.dbo.sysschedules.active_end_time AS VARCHAR ), 3 )
                                   , 2
                                   , 0
                                   , ':'
                                 )
                   WHEN msdb.dbo.sysschedules.active_end_time <>
                       THEN STUFF(
                                     LEFT( CAST ( msdb.dbo.sysschedules.active_end_time AS VARCHAR ), 4 )
                                   , 3
                                   , 0
                                   , ':'
                                 )
                   WHEN msdb.dbo.sysschedules.active_end_time <>
                       THEN STUFF(
                                     LEFT( CAST ( msdb.dbo.sysschedules.active_end_time - 120000 AS VARCHAR ), 3 )
                                   , 2
                                   , 0
                                   , ':'
                                 )
                   ELSE STUFF(
                                 LEFT( CAST ( msdb.dbo.sysschedules.active_end_time - 120000 AS VARCHAR ), 4 )
                               , 3
                               , 0
                               , ':'
                             )
               END
             + CASE
                   WHEN msdb.dbo.sysschedules.active_end_time <>
                   ELSE ' PM'
               END

       ELSE ''
   END AS Schedule

FROM         msdb.dbo.sysjobs INNER JOIN
                      msdb.dbo.sysjobschedules ON msdb.dbo.sysjobs.job_id = msdb.dbo.sysjobschedules.job_id INNER JOIN
                      msdb.dbo.sysschedules ON msdb.dbo.sysjobschedules.schedule_id = msdb.dbo.sysschedules.schedule_id

1 comment:

Jon Morisi said...

had to add this line in three places:
WHEN msdb.dbo.sysschedules.active_start_time < 10000 THEN '12:' + LEFT( CAST ( msdb.dbo.sysschedules.active_start_time AS VARCHAR ), 2 )

This takes account for jobs that run between 12:00 and 1:00 both AM and PM