2013-04-10 40 views
5

Trong một hệ thống tôi quản lý có một số công việc đại lý máy chủ SQL chạy dựa trên lịch biểu được xác định trong dbo.sysschedules.Xác định khi nào lịch trình máy chủ sql sẽ kích hoạt trong một khoảng thời gian?

Tôi muốn tạo chế độ xem lịch trên ứng dụng sẽ hiển thị khi mỗi công việc này được lên lịch để chạy trong khoảng thời gian nhất định. Ví dụ: nếu tôi có lịch biểu được thiết lập để chạy vào ngày thứ Hai đầu tiên và thứ tư của tháng lúc 8:00 sáng, sau đó cho khoảng thời gian của tháng hiện tại (4/2013), tôi muốn nhận được ngày "4/1/2013 8:00 SA, 4/22/2013 8:00 SA "quay lại.

Có ai đi qua một phương pháp để hoàn thành việc này không? Tôi biết rằng tôi có thể đọc trong định nghĩa lịch biểu và tìm ra điều này một cách thực dụng, nhưng tôi tò mò liệu có ai đã đưa ra giải pháp trước khi tôi tự mình đi vào cỏ dại hay không.

Cảm ơn!

+0

không có buit-in chức năng mà những gì bạn muốn. Trừ khi bạn có thể tìm thấy một cái gì đó trên web, lăn lên tay áo của bạn và lội vào kinh dị đó là sysSchedules có thể là lựa chọn duy nhất của bạn. –

Trả lời

0

Tôi sẽ xem xét công cụ này và chạy Profiler để xem các truy vấn thực thi của nó. Đó là một công cụ tiện dụng.

http://sqlsoft.co.uk/sqljobvis.php

+0

Điều này chỉ hiển thị các lần chạy đã xảy ra. Tôi quan tâm hơn đến việc tìm ra khi nào chạy sẽ xảy ra trong tương lai, ngoài chỉ là lần chạy tiếp theo. – Sidawy

0

Có xem xét sau đây trong cơ sở dữ liệu MSDB:

select sj.name, sch.next_run_date, sch.next_run_time 
from sysjobschedules sch 
inner join sysjobs sj 
    on sj.job_id = sch.job_id 
+0

Điều này sẽ giúp tôi chạy ngay lập tức tiếp theo cho một lịch trình nhưng tôi quan tâm nhiều hơn khi lịch biểu sẽ được đặt để chạy trong một khoảng thời gian nhất định. – Sidawy

+0

Hãy nhìn vào bảng sysschedules nó có thông tin bạn cần nhưng sẽ mất một chút công việc để làm việc những gì bạn muốn. –

0

Các liên kết này trông giống như họ sẽ giúp bạn có được trên con đường đúng đắn ...

Generate SQL Agent Job Schedule

Accessing SQL Server Agent Data

Đây là giải pháp tôi đã thay đổi từ mssqltips.com.

WITH next_run_time AS 
    (  
    SELECT  sJOBSCH.schedule_id AS [ScheduleID]    
       ,[sJOB].[name] AS [JobName] 
       ,CASE 
       WHEN [sJOBH].[run_date] IS NULL OR [sJOBH].[run_time] IS NULL THEN NULL 
       ELSE CAST(
       CAST([sJOBH].[run_date] AS CHAR(8)) 
       + ' ' 
       + STUFF(
       STUFF(RIGHT('000000' + CAST([sJOBH].[run_time] AS VARCHAR(6)), 6) 
        , 3, 0, ':') 
       , 6, 0, ':') 
       AS DATETIME) 
       END AS [LastRunDateTime] 
       , CASE [sJOBSCH].[NextRunDate] 
       WHEN 0 THEN NULL 
       ELSE CAST(
       CAST([sJOBSCH].[NextRunDate] AS CHAR(8)) 
       + ' ' 
       + STUFF(
        STUFF(RIGHT('000000' + CAST([sJOBSCH].[NextRunTime] AS VARCHAR(6)), 6) 
        , 3, 0, ':') 
       , 6, 0, ':') 
       AS DATETIME) 
       END AS [NextRunDateTime] 
    FROM  [msdb].[dbo].[sysjobs] AS [sJOB] 
    LEFT JOIN 
    (
    SELECT  [job_id] 
       ,schedule_id 
       ,MIN([next_run_date]) AS [NextRunDate] 
       ,MIN([next_run_time]) AS [NextRunTime] 
    FROM  [msdb].[dbo].[sysjobschedules] 
    GROUP BY [job_id],schedule_id 
    )  AS [sJOBSCH] 

    ON  [sJOB].[job_id] = [sJOBSCH].[job_id] 
    LEFT JOIN 
    (
    SELECT  [job_id] 
       ,[run_date] 
       ,[run_time] 
       ,ROW_NUMBER() OVER (PARTITION BY [job_id] ORDER BY [run_date] DESC, [run_time] DESC 

    )   AS RowNumber 

    FROM  [msdb].[dbo].[sysjobhistory] 
    WHERE  [step_id] = 0 
    )  AS [sJOBH] 

     ON  [sJOB].[job_id] = [sJOBH].[job_id] 
    AND   [sJOBH].[RowNumber] = 1 
    ) 

    , Occurrence AS 
    (
    SELECT  schedule_id AS [ScheduleID] 
       ,[schedule_uid] AS [ScheduleUID] 
       ,[name] AS [ScheduleName] 
       ,CASE [enabled] 
       WHEN 1 THEN 'Yes' 
       WHEN 0 THEN 'No' 
       END AS [IsEnabled] 
       ,CASE 
       WHEN [freq_type] = 64 THEN 'Start automatically when SQL Server Agent starts' 
       WHEN [freq_type] = 128 THEN 'Start whenever the CPUs become idle' 
       WHEN [freq_type] IN (4,8,16,32) THEN 'Recurring' 
       WHEN [freq_type] = 1 THEN 'One Time' 
       END [ScheduleType] 
       ,CASE [freq_type] 
       WHEN 1 THEN 'One Time' 
       WHEN 4 THEN 'Daily' 
       WHEN 8 THEN 'Weekly' 
       WHEN 16 THEN 'Monthly' 
       WHEN 32 THEN 'Monthly - Relative to Frequency Interval' 
       WHEN 64 THEN 'Start automatically when SQL Server Agent starts' 
       WHEN 128 THEN 'Start whenever the CPUs become idle' 
       END [Occurrence] 
       ,CASE [freq_type] 
       WHEN 4 THEN 'Occurs every ' + CAST([freq_interval] AS VARCHAR(3)) + ' day(s)' 
       WHEN 8 THEN 'Occurs every ' + CAST([freq_recurrence_factor] AS VARCHAR(3)) 
         + ' week(s) on ' 
         + CASE WHEN [freq_interval] & 1 = 1 THEN 'Sunday' ELSE '' END 
         + CASE WHEN [freq_interval] & 2 = 2 THEN ', Monday' ELSE '' END 
         + CASE WHEN [freq_interval] & 4 = 4 THEN ', Tuesday' ELSE '' END 
         + CASE WHEN [freq_interval] & 8 = 8 THEN ', Wednesday' ELSE '' END 
         + CASE WHEN [freq_interval] & 16 = 16 THEN ', Thursday' ELSE '' END 
         + CASE WHEN [freq_interval] & 32 = 32 THEN ', Friday' ELSE '' END 
         + CASE WHEN [freq_interval] & 64 = 64 THEN ', Saturday' ELSE '' END 
       WHEN 16 THEN 'Occurs on Day ' + CAST([freq_interval] AS VARCHAR(3)) 
          + ' of every ' 
          + CAST([freq_recurrence_factor] AS VARCHAR(3)) + ' month(s)' 
       WHEN 32 THEN 'Occurs on ' 
         + CASE [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 [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 ' + CAST([freq_recurrence_factor] AS VARCHAR(3)) 
         + ' month(s)' 
       END AS [Recurrence] 
       ,CASE [freq_subday_type] 
       WHEN 1 THEN 'Occurs once at ' 
         + STUFF(
        STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6) 
            , 3, 0, ':') 
           , 6, 0, ':') 
       WHEN 2 THEN 'Occurs every ' 
         + CAST([freq_subday_interval] AS VARCHAR(3)) + ' Second(s) between ' 
         + STUFF(
         STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6) 
            , 3, 0, ':') 
           , 6, 0, ':') 
         + ' & ' 
         + STUFF(
         STUFF(RIGHT('000000' + CAST([active_end_time] AS VARCHAR(6)), 6) 
            , 3, 0, ':') 
           , 6, 0, ':') 
       WHEN 4 THEN 'Occurs every ' 
         + CAST([freq_subday_interval] AS VARCHAR(3)) + ' Minute(s) between ' 
         + STUFF(
         STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6) 
            , 3, 0, ':') 
           , 6, 0, ':') 
         + ' & ' 
         + STUFF(
         STUFF(RIGHT('000000' + CAST([active_end_time] AS VARCHAR(6)), 6) 
            , 3, 0, ':') 
           , 6, 0, ':') 
       WHEN 8 THEN 'Occurs every ' 
         + CAST([freq_subday_interval] AS VARCHAR(3)) + ' Hour(s) between ' 
         + STUFF(
         STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6) 
            , 3, 0, ':') 
           , 6, 0, ':') 
         + ' & ' 
         + STUFF(
         STUFF(RIGHT('000000' + CAST([active_end_time] AS VARCHAR(6)), 6) 
            , 3, 0, ':') 
           , 6, 0, ':') 
       END [Frequency] 
       ,STUFF(
        STUFF(CAST([active_start_date] AS VARCHAR(8)), 5, 0, '-') 
         , 8, 0, '-') AS [ScheduleUsageStartDate] 
       ,STUFF(
       STUFF(CAST([active_end_date] AS VARCHAR(8)), 5, 0, '-') 
        , 8, 0, '-') AS [ScheduleUsageEndDate] 
       ,[date_created] AS [ScheduleCreatedOn] 
       ,[date_modified] AS [ScheduleLastModifiedOn] 
    FROM  [msdb].[dbo].[sysschedules] 

    ) 

    Select  nrt.JobName,nrt.LastRunDateTime,nrt.NextRunDateTime 
       ,o.Occurrence,o.Recurrence 
    From  next_run_time AS nrt 
    Inner Join Occurrence o 
     ON  nrt.ScheduleID = o.ScheduleID 

Và kết quả từ truy vấn này cho tôi.

JobName =========== syspolicy_purge_history

LastRunDateTime ==== 4/23/13 19:47

NextRunDateTime ==== 4/24/13 2: 00

Xảy ra ========= Daily

Recurrence ========= Xảy ra mỗi 1 day (s)

Các vấn đề liên quan