Generate a descriptive list of SQL Agent jobs

Applicability:

SQL Server 2000: N/A

SQL Server 2005: Tested

SQL Server 2008: Tested

SQL Server 2008R2: Tested

SQL Server 2012: Tested

SQL Server 2014: Tested

SQL Server 2016: Tested

SQL Server 2017: Tested

Credits:

Author: Unknown

Date: 10 Jun 2020

Description

Scripting a SQL Agent job using the SSMS interface produces a very raw, and mostly unreadable script, especially where decoding the time schedule is concerned.

This script produces a compact description of the schedule for each job in a very reada ble form.

Code

USE msdb

GO


/*

Microsoft doesn't provide a way to SELECT the job schedule descriptions. They do

provide a stored procedure [msdb.dbo.sp_get_schedule_description] which will return

a job schedule description for one job.


The below select statement was derived from information in that procedure, and lists

all jobs on a server with their name, description and schedule description.

*/


SELECT

j.name

, j.description

, CASE

WHEN j.enabled = 0 THEN 'Disabled'

WHEN s.job_id IS NULL THEN 'Unscheduled'

WHEN s2.freq_type = 0x1 -- OneTime

THEN

'Once on '

+ CONVERT(

CHAR(10)

, CAST( CAST( s2.active_start_date AS VARCHAR ) AS DATETIME )

, 102 -- yyyy.mm.dd

)

WHEN s2.freq_type = 0x4 -- Daily

THEN 'Daily'

WHEN s2.freq_type = 0x8 -- weekly

THEN

CASE

WHEN s2.freq_recurrence_factor = 1

THEN 'Weekly on '

WHEN s2.freq_recurrence_factor > 1

THEN 'Every '

+ CAST( s2.freq_recurrence_factor AS VARCHAR )

+ ' weeks on '

END

+ LEFT(

CASE WHEN s2.freq_interval & 1 = 1 THEN 'Sunday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 2 = 2 THEN 'Monday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 4 = 4 THEN 'Tuesday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 8 = 8 THEN 'Wednesday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 16 = 16 THEN 'Thursday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 32 = 32 THEN 'Friday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 64 = 64 THEN 'Saturday, ' ELSE '' END

, LEN(

CASE WHEN s2.freq_interval & 1 = 1 THEN 'Sunday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 2 = 2 THEN 'Monday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 4 = 4 THEN 'Tuesday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 8 = 8 THEN 'Wednesday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 16 = 16 THEN 'Thursday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 32 = 32 THEN 'Friday, ' ELSE '' END

+ CASE WHEN s2.freq_interval & 64 = 64 THEN 'Saturday, ' ELSE '' END

) - 1 -- LEN() ignores trailing spaces

)

WHEN s2.freq_type = 0x10 -- monthly

THEN

CASE

WHEN s2.freq_recurrence_factor = 1

THEN 'Monthly on the '

WHEN s2.freq_recurrence_factor > 1

THEN 'Every '

+ CAST( s2.freq_recurrence_factor AS VARCHAR )

+ ' months on the '

END

+ CAST( s2.freq_interval AS VARCHAR )

+ CASE

WHEN s2.freq_interval IN ( 1, 21, 31 ) THEN 'st'

WHEN s2.freq_interval IN ( 2, 22 ) THEN 'nd'

WHEN s2.freq_interval IN ( 3, 23 ) THEN 'rd'

ELSE 'th'

END

WHEN s2.freq_type = 0x20 -- monthly relative

THEN

CASE

WHEN s2.freq_recurrence_factor = 1

THEN 'Monthly on the '

WHEN s2.freq_recurrence_factor > 1

THEN 'Every '

+ CAST( s2.freq_recurrence_factor AS VARCHAR )

+ ' months on the '

END

+ CASE s2.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 s2.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 s2.freq_type = 0x40

THEN 'Automatically starts when SQLServerAgent starts.'

WHEN s2.freq_type = 0x80

THEN 'Starts whenever the CPUs become idle'

ELSE ''

END

+ CASE

WHEN j.enabled = 0 THEN ''

WHEN s.job_id IS NULL THEN ''

WHEN s2.freq_subday_type = 0x1 OR s2.freq_type = 0x1

THEN ' at '

+ CASE

WHEN s2.active_start_time = 0 THEN '12:00'

WHEN s2.active_start_time = 120000 THEN '12:00'

WHEN s2.active_start_time < 100000

THEN STUFF(

LEFT( CAST ( s2.active_start_time AS VARCHAR ), 3 )

, 2

, 0

, ':'

)

WHEN s2.active_start_time < 120000

THEN STUFF(

LEFT( CAST ( s2.active_start_time AS VARCHAR ), 4 )

, 3

, 0

, ':'

)

WHEN s2.active_start_time < 220000

THEN STUFF(

LEFT( CAST ( s2.active_start_time - 120000 AS VARCHAR ), 3 )

, 2

, 0

, ':'

)

ELSE STUFF(

LEFT( CAST ( s2.active_start_time - 120000 AS VARCHAR ), 4 )

, 3

, 0

, ':'

)

END

+ CASE

WHEN s2.active_start_time < 120000 THEN ' AM'

ELSE ' PM'

END

WHEN s2.freq_subday_type IN ( 0x2, 0x4, 0x8 )

THEN ' every '

+ CAST( s2.freq_subday_interval AS VARCHAR )

+ CASE freq_subday_type

WHEN 0x2 THEN ' second'

WHEN 0x4 THEN ' minute'

WHEN 0x8 THEN ' hour'

END

+ CASE

WHEN s2.freq_subday_interval > 1 THEN 's'

END

ELSE ''

END

+ CASE

WHEN j.enabled = 0 THEN ''

WHEN s.job_id IS NULL THEN ''

WHEN s2.freq_subday_type IN ( 0x2, 0x4, 0x8 )

THEN ' between '

+ CASE

WHEN s2.active_start_time = 0 THEN '12:00'

WHEN s2.active_start_time = 120000 THEN '12:00'

WHEN s2.active_start_time < 100000

THEN STUFF(

LEFT( CAST ( s2.active_start_time AS VARCHAR ), 3 )

, 2

, 0

, ':'

)

WHEN s2.active_start_time < 120000

THEN STUFF(

LEFT( CAST ( s2.active_start_time AS VARCHAR ), 4 )

, 3

, 0

, ':'

)

WHEN s2.active_start_time < 220000

THEN STUFF(

LEFT( CAST ( s2.active_start_time - 120000 AS VARCHAR ), 3 )

, 2

, 0

, ':'

)

ELSE STUFF(

LEFT( CAST ( s2.active_start_time - 120000 AS VARCHAR ), 4 )

, 3

, 0

, ':'

)

END

+ CASE

WHEN s2.active_start_time < 120000 THEN ' AM'

ELSE ' PM'

END

+ ' and '

+ CASE

WHEN s2.active_end_time = 0 THEN '12:00'

WHEN s2.active_end_time = 120000 THEN '12:00'

WHEN s2.active_end_time < 100000

THEN STUFF(

LEFT( CAST ( s2.active_end_time AS VARCHAR ), 3 )

, 2

, 0

, ':'

)

WHEN s2.active_end_time < 120000

THEN STUFF(

LEFT( CAST ( s2.active_end_time AS VARCHAR ), 4 )

, 3

, 0

, ':'

)

WHEN s2.active_end_time < 220000

THEN STUFF(

LEFT( CAST ( s2.active_end_time - 120000 AS VARCHAR ), 3 )

, 2

, 0

, ':'

)

ELSE STUFF(

LEFT( CAST ( s2.active_end_time - 120000 AS VARCHAR ), 4 )

, 3

, 0

, ':'

)

END

+ CASE

WHEN s2.active_end_time < 120000 THEN ' AM'

ELSE ' PM'

END


ELSE ''

END AS schedule

FROM dbo.sysjobs j WITH (nolock)

LEFT JOIN dbo.sysjobschedules s WITH (nolock)

ON s.job_id = j.job_id

LEFT JOIN dbo.sysschedules s2 WITH (nolock)

ON s.schedule_id = s2.schedule_id

AND s2.enabled = 1

ORDER BY

j.name