สคริปต์เพื่อดูการรันงานใน SQL Server ด้วยเวลาเริ่มงาน


16

วิธีการเขียนสคริปต์เพื่อดูงานใน SQL Server ที่มีเวลาเริ่มงาน?

SELECT sj.name, 
 sja.run_requested_date, 
 CONVERT(VARCHAR(12), sja.stop_execution_date-sja.start_execution_date, 114) Duration
FROM msdb.dbo.sysjobactivity sja
INNER JOIN msdb.dbo.sysjobs sj
ON sja.job_id = sj.job_id
WHERE sja.run_requested_date IS NOT NULL
ORDER BY sja.run_requested_date desc;

ไม่แน่ใจว่าฉันเข้าใจคำถาม คุณต้องการเห็นงานที่กำลังทำอยู่หรือไม่?
Aaron Bertrand

คำตอบ:


49

ผมโพสต์แบบสอบถามกลับในขณะที่ในการรับรายการของงานที่เรียกใช้อยู่ที่นี่

SELECT
    ja.job_id,
    j.name AS job_name,
    ja.start_execution_date,      
    ISNULL(last_executed_step_id,0)+1 AS current_executed_step_id,
    Js.step_name
FROM msdb.dbo.sysjobactivity ja 
LEFT JOIN msdb.dbo.sysjobhistory jh 
    ON ja.job_history_id = jh.instance_id
JOIN msdb.dbo.sysjobs j 
ON ja.job_id = j.job_id
JOIN msdb.dbo.sysjobsteps js
    ON ja.job_id = js.job_id
    AND ISNULL(ja.last_executed_step_id,0)+1 = js.step_id
WHERE ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC)
AND start_execution_date is not null
AND stop_execution_date is null;

นี่คือชื่องาน, รหัสงาน, เวลาเริ่มต้นและขั้นตอนที่จะดำเนินการ หากคุณไปที่ลิงก์ด้านบนคุณจะได้รับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการที่ฉันมากับมันและสิ่งอื่นที่มีอยู่


6
น่าเสียดายที่สคริปต์นี้อนุมานว่าขั้นตอนที่รันอยู่ในปัจจุบันเป็นขั้นตอนหลังจากเสร็จสิ้นขั้นตอนสุดท้าย ไม่เป็นเช่นนั้นเสมอไป
ทอดด์ McDermid

3

ฉันพบปัญหาในเซิร์ฟเวอร์ตัวใดตัวหนึ่งของฉันที่สืบค้นตาราง MSDB (รหัสอาคาที่ระบุไว้ข้างต้น) เนื่องจากงานของฉันจะเริ่มทำงาน แต่มันก็ไม่ได้ มีระบบจัดเก็บกระบวนการที่ส่งคืนสถานะการดำเนินการ แต่ไม่สามารถทำคำสั่งแทรก exec โดยไม่มีข้อผิดพลาด ข้างในนั้นเป็นอีกระบบที่จัดเก็บโพรซีเดอร์ที่สามารถใช้กับคำสั่ง insert exec

INSERT INTO #Job
EXEC master.dbo.xp_sqlagent_enum_jobs 1,dbo

และตารางที่จะโหลดลงใน:

CREATE TABLE #Job 
           (job_id               UNIQUEIDENTIFIER NOT NULL,  
           last_run_date         INT              NOT NULL,  
           last_run_time         INT              NOT NULL,  
           next_run_date         INT              NOT NULL,  
           next_run_time         INT              NOT NULL,  
           next_run_schedule_id  INT              NOT NULL,  
           requested_to_run      INT              NOT NULL, -- BOOL  
           request_source        INT              NOT NULL,  
           request_source_id     sysname          COLLATE database_default NULL,  
           running               INT              NOT NULL, -- BOOL  
           current_step          INT              NOT NULL,  
           current_retry_attempt INT              NOT NULL,  
           job_state             INT              NOT NULL) 

1

สิ่งนี้จะให้ชื่องานและเรียกใช้วันที่และเวลาคุณสามารถลบวันที่ได้หากคุณต้องการเห็นชื่อและเวลาที่เรียกใช้

SELECT
j.name AS 'JobName',
run_date,
run_time,
msdb.dbo.agent_datetime(run_date, run_time) AS 'RunDateTime'
FROM msdb.dbo.sysjobs j 
JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id 
WHERE j.enabled = 1  --Only Enabled Jobs
ORDER BY JobName, RunDateTime desc

+1 สำหรับ msdb.dbo.agent_datetime (run_date, run_time)
Alocyte

1

สคริปต์นี้จะแสดงงานที่กำลังทำงานอยู่รวมถึงขั้นตอนที่กำลังดำเนินการอยู่:

-- From http://www.databasejournal.com/features/mssql/article.php/10894_3491201_2/Detecting-The-State-of-a-SQL-Server-Agent-Job.htm
    CREATE TABLE #ENUM_JOB 
    ( 
        Job_ID UNIQUEIDENTIFIER, 
        Last_Run_Date INT, 
        Last_Run_Time INT, 
        Next_Run_Date INT, 
        Next_Run_Time INT, 
        Next_Run_Schedule_ID INT, 
        Requested_To_Run INT, 
        Request_Source INT, 
        Request_Source_ID VARCHAR(100), 
        Running INT, 
        Current_Step INT, 
        Current_Retry_Attempt INT, 
        State INT 
    )
    INSERT INTO #ENUM_JOB 
         EXEC master.dbo.xp_sqlagent_enum_jobs 1,garbage
    SELECT E.*, SJ.name AS job_name, SJS.step_name
        FROM #ENUM_JOB AS E
        JOIN msdb.dbo.sysjobs AS SJ
            ON SJ.job_id = E.Job_ID
        JOIN msdb.dbo.sysjobsteps AS SJS
            ON SJS.job_id = SJ.job_id
            AND SJS.step_id = E.Current_Step
    DROP TABLE #ENUM_JOB

0

สคริปต์ต่อไปนี้จะคืนค่า:

  • ชื่องาน
  • รหัสงาน
  • เวลาที่ของาน
  • เวลาดำเนินงาน
SELECT sj.name
   , sja.*
FROM msdb.dbo.sysjobactivity AS sja
INNER JOIN msdb.dbo.sysjobs AS sj ON sja.job_id = sj.job_id
WHERE sja.start_execution_date IS NOT NULL
   AND sja.stop_execution_date IS NULL

3
สำหรับฉันแบบสอบถามนี้ส่งคืนงานที่ปิดใช้งานซึ่งไม่ได้ทำงานจริง ๆ
Nick.McDermaid

1
คำตอบโดย @Kenneth นั้นดีกว่าเพราะจะส่งคืนงานที่รันอยู่ในปัจจุบันเท่านั้น
Niraj

0

มันอาจจะเป็นเพียงเล็กน้อยรอบ ๆ บ้าน

;WITH cJobDetail AS (
    SELECT 
        ja.job_id
        ,j.name
        ,ja.start_execution_date
        ,ja.last_executed_step_id
        --,j.start_step_id
        ,CASE 
            WHEN j.start_step_id = COALESCE(ja.last_executed_step_id,j.start_step_id) THEN j.start_step_id
            ELSE NULL
            END AS ExecutingStepId
        ,ja.job_history_id
        ,DATEDIFF(HOUR, ja.start_execution_date, COALESCE(ja.stop_execution_date,SYSDATETIME())) AS JobHourRunning
        ,DATEDIFF(SECOND, ja.start_execution_date, COALESCE(ja.stop_execution_date,SYSDATETIME())) / 60 % 60 AS JobMinuteRunning
        ,DATEDIFF(SECOND, ja.start_execution_date, COALESCE(ja.stop_execution_date,SYSDATETIME())) % 60 AS JobSecondRunning 
    FROM dbo.sysjobactivity ja
    INNER JOIN dbo.sysjobs j
        ON ja.job_id = j.job_id
    WHERE ja.start_execution_date IS NOT NULL
    AND ja.stop_execution_date IS NULL
)
,MaxJobHistoryStepStatus AS (
    SELECT jh.job_id, jh.step_id, MAX(jh.instance_id) AS MaxInstanceId
    FROM cJobDetail jd
    INNER JOIN dbo.sysjobhistory jh
        ON jd.job_id = jh.job_id
        AND jd.last_executed_step_id = jh.step_id
    GROUP BY jh.job_id, jh.step_id
    )

SELECT 
    jd.job_id
    ,jd.name
    ,jd.start_execution_date 
    ,COALESCE(
                CASE jh.run_status 
                        WHEN 1 THEN 
                                    CASE js.on_success_action
                                                            WHEN 3 THEN jd.last_executed_step_id + 1
                                                            WHEN 4 THEN js.on_success_step_id
                                    END
                        WHEN 0 THEN 
                                    CASE js.on_fail_action
                                                        WHEN 3 THEN jd.last_executed_step_id + 1
                                                        WHEN 4 THEN js.on_fail_step_id
                                    END
                END,jd.ExecutingStepId) AS StepId
    ,jd.JobHourRunning
    ,jd.JobMinuteRunning
    ,jd.JobSecondRunning                                
FROM cJobDetail jd
LEFT JOIN MaxJobHistoryStepStatus mhs
    ON jd.job_id = mhs.job_id
LEFT JOIN dbo.sysjobhistory jh
    ON mhs.MaxInstanceId = jh.instance_id
LEFT JOIN dbo.sysjobsteps js
    ON mhs.job_id = js.job_id
    AND mhs.step_id = js.step_id
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.