Thursday, 9 February 2012

SQL Server Jobs Monitoring Script

Enterprise databases have many jobs running on them, some of them take care of daily loads like incremental loads, extract generators, database maintenance activities , hourly jobs which are used for delivering reports through e-mail.

These huge databases are maintained by support teams, and they have to keep an eye on the progression or status of a specific jobs , as the loading or extracts generation should complete within a time limit. Below is a useful script to get the list of jobs running on a server at that moment.


BEGIN

DECLARE @jobstatus
TABLE(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 @jobstatus
EXEC MASTER.dbo.xp_sqlagent_enum_jobs 1,garbage 

                BEGIN

                SELECT DISTINCT CASE         
                   WHEN state=1 THEN 'Job is Executing'
                   WHEN state=2 THEN 'Waiting for thread to complete'
                   WHEN state=3 THEN 'Between retries'
                   WHEN state=4 THEN 'Job is Idle'
                   WHEN state=5 THEN 'Job is suspended'
                   WHEN state=7 THEN 'Performing completion actions'

                END AS State,sj.name,
                CASE WHEN ej.running=1 THEN st.step_id ELSE 0 END AS currentstepid,
                CASE WHEN ej.running=1 THEN st.step_name ELSE 'not executing' END AS currentstepname,
                st.command, ej.request_source_id
               
                FROM @jobstatus ej join msdb..sysjobs sj ON sj.job_id=ej.job_id
                JOIN msdb..sysjobsteps st ON st.job_id=ej.job_id AND (st.step_id=ej.current_step or ej.current_step=0)

                WHERE ej.running+1>1

                END

END

xp_sqlagent_enum_jobs is an undocumented procedure in SQL Server. The documented SP for this is sp_help_job.  It eventually calls the xp_sqlagent_enum_jobs procedure. If you created a table to hold the results from this procedure, you could find plenty of documentation in it.

No comments:

Post a Comment