How can I determine the status of a job?

前端 未结 14 2261
佛祖请我去吃肉
佛祖请我去吃肉 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:50

    I would like to point out that none of the T-SQL on this page will work precisely because none of them join to the syssessions table to get only the current session and therefore could include false positives.

    See this for reference: What does it mean to have jobs with a null stop date?

    You can also validate this by analyzing the sp_help_jobactivity procedure in msdb.

    I realize that this is an old message on SO, but I found this message only partially helpful because of the problem.

    SELECT
        job.name, 
        job.job_id, 
        job.originating_server, 
        activity.run_requested_date, 
        DATEDIFF( SECOND, activity.run_requested_date, GETDATE() ) as Elapsed
    FROM 
        msdb.dbo.sysjobs_view job
    JOIN
        msdb.dbo.sysjobactivity activity
    ON 
        job.job_id = activity.job_id
    JOIN
        msdb.dbo.syssessions sess
    ON
        sess.session_id = activity.session_id
    JOIN
    (
        SELECT
            MAX( agent_start_date ) AS max_agent_start_date
        FROM
            msdb.dbo.syssessions
    ) sess_max
    ON
        sess.agent_start_date = sess_max.max_agent_start_date
    WHERE 
        run_requested_date IS NOT NULL AND stop_execution_date IS NULL
    
    0 讨论(0)
  • 2020-11-30 02:50

    Below script gets job status for every job on the server. It also tells how many steps are there and what is the currently running step and elasped time.

    SELECT sj.Name,
        CASE
            WHEN sja.start_execution_date IS NULL THEN 'Never ran'
            WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NULL THEN 'Running'
            WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NOT NULL THEN 'Not running'
        END AS 'RunStatus',
        CASE WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NULL then js.StepCount else null end As TotalNumberOfSteps,
        CASE WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NULL then ISNULL(sja.last_executed_step_id+1,js.StepCount) else null end as currentlyExecutingStep,
        CASE WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NULL then datediff(minute, sja.run_requested_date, getdate()) ELSE NULL end as ElapsedTime
    FROM msdb.dbo.sysjobs sj
    JOIN msdb.dbo.sysjobactivity sja
    ON sj.job_id = sja.job_id
    CROSS APPLY (SELECT COUNT(*) FROM msdb.dbo.sysjobsteps as js WHERE js.job_id = sj.job_id) as js(StepCount)
    WHERE session_id = (
        SELECT MAX(session_id) FROM msdb.dbo.sysjobactivity)
    ORDER BY RunStatus desc
    
    0 讨论(0)
  • 2020-11-30 02:54

    This will show last run status/time or if running, it shows current run time, step number/info, and SPID (if it has associated SPID). It also shows enabled/disabled and job user where it converts to NT SID format for unresolved user accounts.

    CREATE TABLE #list_running_SQL_jobs
    (
        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 NULL
      , running INT NOT NULL
      , current_step INT NOT NULL
      , current_retry_attempt INT NOT NULL
      , job_state INT NOT NULL
    );
    
    DECLARE @sqluser NVARCHAR(128)
          , @is_sysadmin INT;
    
    SELECT @is_sysadmin = ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0);
    
    DECLARE read_sysjobs_for_running CURSOR FOR
        SELECT DISTINCT SUSER_SNAME(owner_sid)FROM msdb.dbo.sysjobs;
    OPEN read_sysjobs_for_running;
    FETCH NEXT FROM read_sysjobs_for_running
    INTO @sqluser;
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO #list_running_SQL_jobs
        EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @sqluser;
        FETCH NEXT FROM read_sysjobs_for_running
        INTO @sqluser;
    END;
    
    CLOSE read_sysjobs_for_running;
    DEALLOCATE read_sysjobs_for_running;
    
    SELECT j.name
         , 'Enbld' = CASE j.enabled
                         WHEN 0
                             THEN 'no'
                         ELSE 'YES'
                     END
         , '#Min' = DATEDIFF(MINUTE, a.start_execution_date, ISNULL(a.stop_execution_date, GETDATE()))
         , 'Status' = CASE
                          WHEN a.start_execution_date IS NOT NULL
                              AND a.stop_execution_date IS NULL
                              THEN 'Executing'
                          WHEN h.run_status = 0
                              THEN 'FAILED'
                          WHEN h.run_status = 2
                              THEN 'Retry'
                          WHEN h.run_status = 3
                              THEN 'Canceled'
                          WHEN h.run_status = 4
                              THEN 'InProg'
                          WHEN h.run_status = 1
                              THEN 'Success'
                          ELSE 'Idle'
                      END
         , r.current_step
         , spid = p.session_id
         , owner = ISNULL(SUSER_SNAME(j.owner_sid), 'S-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 1))) - CONVERT(BIGINT, 256) * CONVERT(BIGINT, UNICODE(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 1)) / 256)) + '-' + CONVERT(NVARCHAR(12), UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 4), 1)) / 256 + CONVERT(BIGINT, NULLIF(UNICODE(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 1)) / 256, 0)) - CONVERT(BIGINT, UNICODE(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 1)) / 256)) + ISNULL('-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 5), 1))) + CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 6), 1))) * CONVERT(BIGINT, 65536) + CONVERT(BIGINT, NULLIF(SIGN(LEN(CONVERT(NVARCHAR(256), j.owner_sid)) - 6), -1)) * 0), '') + ISNULL('-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 7), 1))) + CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 8), 1))) * CONVERT(BIGINT, 65536) + CONVERT(BIGINT, NULLIF(SIGN(LEN(CONVERT(NVARCHAR(256), j.owner_sid)) - 8), -1)) * 0), '') + ISNULL('-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 9), 1))) + CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 10), 1))) * CONVERT(BIGINT, 65536) + CONVERT(BIGINT, NULLIF(SIGN(LEN(CONVERT(NVARCHAR(256), j.owner_sid)) - 10), -1)) * 0), '') + ISNULL('-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 11), 1))) + CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 12), 1))) * CONVERT(BIGINT, 65536) + CONVERT(BIGINT, NULLIF(SIGN(LEN(CONVERT(NVARCHAR(256), j.owner_sid)) - 12), -1)) * 0), '') + ISNULL('-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 13), 1))) + CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 14), 1))) * CONVERT(BIGINT, 65536) + CONVERT(BIGINT, NULLIF(SIGN(LEN(CONVERT(NVARCHAR(256), j.owner_sid)) - 14), -1)) * 0), '')) --SHOW as NT SID when unresolved
         , a.start_execution_date
         , a.stop_execution_date
         , t.subsystem
         , t.step_name
    FROM msdb.dbo.sysjobs j
        LEFT OUTER JOIN (SELECT DISTINCT * FROM #list_running_SQL_jobs) r
            ON j.job_id = r.job_id
        LEFT OUTER JOIN msdb.dbo.sysjobactivity a
            ON j.job_id = a.job_id
                AND a.start_execution_date IS NOT NULL
                --AND a.stop_execution_date IS NULL
                AND NOT EXISTS
                (
                    SELECT *
                    FROM msdb.dbo.sysjobactivity at
                    WHERE at.job_id = a.job_id
                        AND at.start_execution_date > a.start_execution_date
                )
        LEFT OUTER JOIN sys.dm_exec_sessions p
            ON p.program_name LIKE 'SQLAgent%0x%'
                AND j.job_id = SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 7, 2) + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 5, 2) + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 3, 2) + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 1, 2) + '-' + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 11, 2) + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 9, 2) + '-' + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 15, 2) + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 13, 2) + '-' + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 17, 4) + '-' + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 21, 12)
        LEFT OUTER JOIN msdb.dbo.sysjobhistory h
            ON j.job_id = h.job_id
                AND h.instance_id = a.job_history_id
        LEFT OUTER JOIN msdb.dbo.sysjobsteps t
            ON t.job_id = j.job_id
                AND t.step_id = r.current_step
    ORDER BY 1;
    
    DROP TABLE #list_running_SQL_jobs;
    
    0 讨论(0)
  • 2020-11-30 02:56

    You haven't specified how would you like to see these details.

    For the first sight I would suggest to check Server Management Studio.

    You can see the jobs and current statuses in the SQL Server Agent part, under Jobs. If you pick a job, the Property page shows a link to the Job History, where you can see the start and end time, if there any errors, which step caused the error, and so on.

    You can specify alerts and notifications to email you or to page you when the job finished successfully or failed.

    There is a Job Activity Monitor, but actually I never used it. You can have a try.

    If you want to check it via T-SQL, then I don't know how you can do that.

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

    I ran into issues on one of my servers querying MSDB tables (aka code listed above) as one of my jobs would come up running, but it was not. There is a system stored procedure that returns the execution status, but one cannot do a insert exec statement without an error. Inside that is another system stored procedure that can be used with an insert exec statement.

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

    And the table to load it into:

    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) 
    
    0 讨论(0)
  • 2020-11-30 02:59

    You could try using the system stored procedure sp_help_job. This returns information on the job, its steps, schedules and servers. For example

    EXEC msdb.dbo.sp_help_job @Job_name = 'Your Job Name'
    

    SQL Books Online should contain lots of information about the records it returns.

    For returning information on multiple jobs, you could try querying the following system tables which hold the various bits of information on the job

    • msdb.dbo.SysJobs
    • msdb.dbo.SysJobSteps
    • msdb.dbo.SysJobSchedules
    • msdb.dbo.SysJobServers
    • msdb.dbo.SysJobHistory

    Their names are fairly self-explanatory (apart from SysJobServers which hold information on when the job last run and the outcome).

    Again, information on the fields can be found at MSDN. For example, check out the page for SysJobs

    0 讨论(0)
提交回复
热议问题