Results 1 to 3 of 3

Thread: MSSQL: find what jobs had to start during server was down

  1. #1
    Join Date
    Apr 2007
    Posts
    2

    MSSQL: find what jobs had to start during server was down

    Hi,
    This is the situation:
    There are around 300 jobs on the server. The server shutsdown abnormally and is not functional for let's say 2 hours. After the server is back on, I need to find what jobs had to start during the server was down.
    Is there a way to get this list? I tried to write an SQL script that tells me the needed information, but the job schedule sheme is so complex that it would take too much time in developing such SQL script. Maybe anybody has a better solution, or has already made a similar script?
    ThankYou.

  2. #2
    Join Date
    Sep 2002
    Posts
    5,938
    Quick way is query msdb..sysjobschedules.

  3. #3
    Join Date
    Dec 2004
    Posts
    502
    Here's something I wrote that might help. First, create this function:

    CREATE FUNCTION fn_calc_days
    (@freq_type int)
    RETURNS varchar(100)
    AS
    BEGIN
    DECLARE @basetwo TABLE(day_value int NULL, day_name varchar(10) NULL)
    DECLARE @days TABLE(day_value int NULL, day_name varchar(10) NULL)
    DECLARE @day_value int,
    @remainder int,
    @day_name varchar(10),
    @day_string varchar(100),
    @table_count int,
    @day_value_now int,
    @counter int

    INSERT INTO @basetwo VALUES(1, 'Sunday')
    INSERT INTO @basetwo VALUES(2, 'Monday')
    INSERT INTO @basetwo VALUES(4, 'Tuesday')
    INSERT INTO @basetwo VALUES(8, 'Wednesday')
    INSERT INTO @basetwo VALUES(16, 'Thursday')
    INSERT INTO @basetwo VALUES(32, 'Friday')
    INSERT INTO @basetwo VALUES(64, 'Saturday')

    SET @remainder = @freq_type

    WHILE @remainder > 0
    BEGIN
    SELECT @day_value = MAX(day_value) FROM @basetwo WHERE day_value <= @remainder
    INSERT INTO @days(day_value) VALUES(@day_value)
    SELECT @remainder = @remainder - @day_value
    END

    UPDATE B
    SET day_name = A.day_name
    FROM @basetwo A, @days B
    WHERE A.day_value = B.day_value

    SELECT @table_count = COUNT(*) FROM @days
    SET @counter = 1
    SET @day_string = ''
    SET @day_value_now = 0

    WHILE @counter <= @table_count
    BEGIN
    SELECT @day_name = day_name FROM @days WHERE day_value = (SELECT MIN(day_value) FROM @days WHERE day_value > @day_value_now)
    SELECT @day_string = @day_string + ' ' + @day_name
    SELECT @day_value_now = day_value FROM @days WHERE day_name = @day_name
    SET @counter = @counter +1
    END

    SET @day_string = LTRIM(RTRIM(@day_string))

    RETURN @day_string
    END
    GO



    Then run this query:

    SELECT
    X.JobName, X.Enabled,
    CASE WHEN X.Alert IS NOT NULL THEN 'RAISERROR ' + CONVERT(varchar, X.Alert)
    ELSE LTRIM(RTRIM(REPLACE(
    CASE WHEN X.MonByDayInterval = '0' THEN ''
    ELSE X.MonByDayInterval END + ' ' +
    CASE WHEN ISNUMERIC(ISNULL(X.FreqInterval, 0)) = 0 THEN ISNULL(X.FreqInterval, '')
    ELSE '' END + ' ' +
    CASE WHEN X.FreqSubdayType IS NOT NULL AND ISNUMERIC(X.FreqInterval) = 0 THEN 'every '
    ELSE CASE WHEN ISNUMERIC(X.FreqInterval) = 1 THEN 'Every '
    ELSE '' END END +
    CASE WHEN X.FreqSubdayType = 'days' THEN
    CASE WHEN X.FreqInterval = 1 THEN ''
    ELSE CONVERT(varchar, ISNULL(X.FreqInterval, '')) END
    ELSE CASE WHEN X.FreqSubDayNbr = 1 THEN ''
    WHEN X.FreqSubDayNbr = 0 AND X.FreqSubdayType IS NULL THEN 'Once'
    ELSE ISNULL(CONVERT(varchar, X.FreqSubDayNbr), '') END END + ' ' +
    CASE WHEN (CONVERT(varchar, X.FreqInterval) = '1' AND X.FreqSubDayNbr = 0) OR X.FreqSubDayNbr = 1 THEN STUFF(X.FreqSubdayType, LEN(X.FreqSubdayType), 1, '')
    ELSE CONVERT(varchar, ISNULL(X.FreqSubdayType, '')) END
    , ' ', ' '))) END AS [Description],
    X.ActiveStartTime, X.ActiveEndTime
    FROM (SELECT
    A.[name] AS JobName,
    CASE A.enabled WHEN 1 THEN 'ENABLED' WHEN 0 THEN 'DISABLED' END AS Enabled,
    CASE WHEN B.freq_type = 32 THEN
    CASE B.freq_relative_interval WHEN 1 THEN 'First' WHEN 2 THEN '2nd' WHEN 4 THEN '3rd' WHEN 8 THEN '4th' WHEN 16 THEN 'Last' END
    ELSE '0' END AS MonByDayInterval,
    CASE B.freq_type
    WHEN 4 THEN CONVERT(varchar, B.freq_interval) -- If freq_type = 4, then freq_interval = number of days
    WHEN 8 THEN
    CASE B.freq_interval WHEN 1 THEN 'Sunday' WHEN 2 THEN 'Monday' WHEN 4 THEN 'Tuesday' WHEN 8 THEN 'Wednesday' WHEN 16 THEN 'Thursday' WHEN 32 THEN 'Friday' WHEN 64 THEN 'Saturday'
    ELSE maintenance.dbo.fn_calc_days(B.freq_interval) END
    WHEN 16 THEN CONVERT(varchar, B.freq_interval) -- If freq_type = 16, then freq_interval = date of month
    WHEN 32 THEN
    CASE B.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
    END AS FreqInterval,
    B.freq_subday_interval + B.freq_recurrence_factor AS FreqSubDayNbr,
    CASE B.freq_subday_type WHEN 1 THEN
    CASE WHEN B.freq_type = 4 THEN 'days' WHEN B.freq_type = 8 THEN 'weeks' WHEN B.freq_type = 16 OR B.freq_type = 32 THEN 'months' END
    WHEN 4 THEN 'minutes' WHEN 8 THEN 'hours' END AS FreqSubdayType,
    REVERSE(STUFF(STUFF(REVERSE(REPLICATE('0', 6 - LEN(CONVERT(varchar, B.active_start_time))) + CONVERT(varchar, B.active_start_time)), 3, 0, ':'), 6, 0, ':')) AS ActiveStartTime,
    CASE B.active_end_time WHEN 235959 THEN 'n/a'
    ELSE REVERSE(STUFF(STUFF(REVERSE(REPLICATE('0', 6 - LEN(CONVERT(varchar, B.active_end_time))) + CONVERT(varchar, B.active_end_time)), 3, 0, ':'), 6, 0, ':')) END AS ActiveEndTime,
    C.message_id AS Alert
    FROM msdb..sysjobs A
    LEFT JOIN msdb..sysjobschedules B ON A.job_id = B.job_id
    LEFT JOIN msdb..sysalerts C ON A.job_id = C.job_id) AS X
    ORDER BY X.Enabled, X.ActiveStartTime

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •