How can I determine the status of a job?

前端 未结 14 2259
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-30 02:36

I have a Stored procedure which schedules a job. This Job takes a lot of time to get completed (approx 30 to 40 min). I need to get to know the status of this Job. Below det

相关标签:
14条回答
  • 2020-11-30 02:40

    This is what I'm using to get the running jobs (principally so I can kill the ones which have probably hung):

    SELECT
        job.Name, job.job_ID
        ,job.Originating_Server
        ,activity.run_requested_Date
        ,datediff(minute, activity.run_requested_Date, getdate()) AS Elapsed
    FROM
        msdb.dbo.sysjobs_view job 
            INNER JOIN msdb.dbo.sysjobactivity activity
            ON (job.job_id = activity.job_id)
    WHERE
        run_Requested_date is not null 
        AND stop_execution_date is null
        AND job.name like 'Your Job Prefix%'
    

    As Tim said, the MSDN / BOL documentation is reasonably good on the contents of the sysjobsX tables. Just remember they are tables in MSDB.

    0 讨论(0)
  • 2020-11-30 02:40

    The most simple way I found was to create a stored procedure. Enter the 'JobName' and hit go.

    /*-----------------------------------------------------------------------------------------------------------
    
        Document Title: usp_getJobStatus
    
        Purpose:        Finds a Current Jobs Run Status     
        Input Example:  EXECUTE usp_getJobStatus 'MyJobName'
    
    -------------------------------------------------------------------------------------------------------------*/
    
        IF OBJECT_ID ( 'usp_getJobStatus','P' ) IS NOT NULL
        DROP PROCEDURE  usp_getJobStatus;
    
        GO
    
            CREATE PROCEDURE  usp_getJobStatus 
                              @JobName NVARCHAR (1000)
    
        AS
    
            IF OBJECT_ID('TempDB..#JobResults','U') IS NOT NULL DROP TABLE #JobResults
            CREATE TABLE #JobResults ( 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,
                                       Request_Source        INT NOT NULL, 
                                       Request_Source_id     SYSNAME 
                                       COLLATE Database_Default      NULL, 
                                       Running               INT NOT NULL,
                                       Current_Step          INT NOT NULL, 
                                       Current_Retry_Attempt INT NOT NULL, 
                                       Job_State             INT NOT NULL ) 
    
            INSERT  #JobResults 
            EXECUTE master.dbo.xp_sqlagent_enum_jobs 1, '';
    
            SELECT  job.name                                                AS [Job_Name], 
                  ( SELECT  MAX(CAST( STUFF(STUFF(CAST(jh.run_date AS VARCHAR),7,0,'-'),5,0,'-') + ' ' + 
                            STUFF(STUFF(REPLACE(STR(jh.run_time,6,0),' ','0'),5,0,':'),3,0,':') AS DATETIME))
                    FROM    msdb.dbo.sysjobs AS j 
                        INNER JOIN msdb.dbo.sysjobhistory AS jh 
                           ON jh.job_id = j.job_id AND jh.step_id = 0 
                    WHERE j.[name] LIKE '%' + @JobName + '%' 
                    GROUP BY j.[name] )                                     AS [Last_Completed_DateTime], 
                  ( SELECT  TOP 1 start_execution_date 
                    FROM    msdb.dbo.sysjobactivity
                    WHERE   job_id = r.job_id
                    ORDER BY start_execution_date DESC )                    AS [Job_Start_DateTime],
                CASE 
                    WHEN r.running = 0 THEN
                        CASE 
                            WHEN jobInfo.lASt_run_outcome = 0 THEN 'Failed'
                            WHEN jobInfo.lASt_run_outcome = 1 THEN 'Success'
                            WHEN jobInfo.lASt_run_outcome = 3 THEN 'Canceled'
                            ELSE 'Unknown'
                        END
                            WHEN r.job_state = 0 THEN 'Success'
                            WHEN r.job_state = 4 THEN 'Success'
                            WHEN r.job_state = 5 THEN 'Success'
                            WHEN r.job_state = 1 THEN 'In Progress'
                            WHEN r.job_state = 2 THEN 'In Progress'
                            WHEN r.job_state = 3 THEN 'In Progress'
                            WHEN r.job_state = 7 THEN 'In Progress'
                         ELSE 'Unknown' END                                 AS [Run_Status_Description]
            FROM    #JobResults AS r 
                LEFT OUTER JOIN msdb.dbo.sysjobservers AS jobInfo 
                   ON r.job_id = jobInfo.job_id 
                INNER JOIN msdb.dbo.sysjobs AS job 
                   ON r.job_id = job.job_id 
            WHERE   job.[enabled] = 1
                    AND job.name LIKE '%' + @JobName + '%'
    
    0 讨论(0)
  • 2020-11-30 02:40
    ;WITH CTE_JobStatus
    AS (
        SELECT DISTINCT NAME AS [JobName]
            ,s.step_id
            ,s.step_name
            ,CASE 
                WHEN [Enabled] = 1
                    THEN 'Enabled'
                ELSE 'Disabled'
                END [JobStatus]
            ,CASE 
                WHEN SJH.run_status = 0
                    THEN 'Failed'
                WHEN SJH.run_status = 1
                    THEN 'Succeeded'
                WHEN SJH.run_status = 2
                    THEN 'Retry'
                WHEN SJH.run_status = 3
                    THEN 'Cancelled'
                WHEN SJH.run_status = 4
                    THEN 'In Progress'
                ELSE 'Unknown'
                END [JobOutcome]
            ,CONVERT(VARCHAR(8), sjh.run_date) [RunDate]
            ,CONVERT(VARCHAR(8), STUFF(STUFF(CONVERT(TIMESTAMP, RIGHT('000000' + CONVERT(VARCHAR(6), sjh.run_time), 6)), 3, 0, ':'), 6, 0, ':')) RunTime
            ,RANK() OVER (
                PARTITION BY s.step_name ORDER BY sjh.run_date DESC
                    ,sjh.run_time DESC
                ) AS rn
            ,SJH.run_status
        FROM msdb..SYSJobs sj
        INNER JOIN msdb..SYSJobHistory sjh ON sj.job_id = sjh.job_id
        INNER JOIN msdb.dbo.sysjobsteps s ON sjh.job_id = s.job_id
            AND sjh.step_id = s.step_id
        WHERE (sj.NAME LIKE 'JOB NAME')
            AND sjh.run_date = CONVERT(CHAR, getdate(), 112)
        )
    SELECT *
    FROM CTE_JobStatus
    WHERE rn = 1
        AND run_status NOT IN (1,4)
    
    0 讨论(0)
  • 2020-11-30 02:43

    This is an old question, but I just had a similar situation where I needed to check on the status of jobs on SQL Server. A lot of people mentioned the sysjobactivity table and pointed to the MSDN documentation which is great. However, I'd also like to highlight the Job Activity Monitor which provides the status on all jobs that are defined on your server.

    0 讨论(0)
  • 2020-11-30 02:45

    we can query the msdb in many ways to get the details.

    few are

    select job.Name, job.job_ID, job.Originating_Server,activity.run_requested_Date,
    datediff(minute, activity.run_requested_Date, getdate()) as Elapsed 
    from msdb.dbo.sysjobs_view job 
    inner join msdb.dbo.sysjobactivity activity on (job.job_id = activity.job_id) 
    where run_Requested_date is not null 
    and stop_execution_date is null 
    and job.name like 'Your Job Prefix%'
    
    0 讨论(0)
  • 2020-11-30 02:46
    -- Microsoft SQL Server 2008 Standard Edition:
    IF EXISTS(SELECT 1 
              FROM msdb.dbo.sysjobs J 
              JOIN msdb.dbo.sysjobactivity A 
                  ON A.job_id=J.job_id 
              WHERE J.name=N'Your Job Name' 
              AND A.run_requested_date IS NOT NULL 
              AND A.stop_execution_date IS NULL
             )
        PRINT 'The job is running!'
    ELSE
        PRINT 'The job is not running.'
    
    0 讨论(0)
提交回复
热议问题