작업 시작 시간이있는 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;

작업 이름, 작업 ID, 시작 시간 및 실행중인 단계가 있습니다. 위의 링크를 따라 가면 내가 찾은 방법과 사용 가능한 다른 것에 대해 더 자세히 알 수 있습니다.


6
불행하게도,이 스크립트는 현재 실행중인 단계가 마지막 완료 단계 이후의 단계라고 가정합니다. 항상 그런 것은 아닙니다.
토드 맥더 미드

3

내 작업 중 하나가 실행되는 것처럼 MSDB 테이블을 쿼리하는 서버 중 하나 (위에 나열된 코드)에서 문제가 발생했지만 그렇지 않았습니다. 실행 상태를 반환하는 시스템 저장 프로 시저가 있지만 오류없이 insert 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

msdb.dbo.agent_datetime (run_date, run_time) +1
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

다음 스크립트는 다음을 반환합니다.

  • 직업 이름
  • 직업 ID
  • 작업 요청 시간
  • 작업 실행 시간
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.