join the MSSQLTips community

Today's Site Sponsor


 

SQL Compare quickly and easily compares and synchronizes SQL Server database schemas
 



What's slowing you down?

Failed SQL Server Agent Jobs

Written By: Jeremy Kadlec -- 10/12/2006 -- read/post comments -- print -- Bookmark and Share

Rating: (not rated yet) Rate

Problem
With most, if not all organizations, when executing processes during non business hours it is imperative to know if and when the these processes fail.  At a minimum, full backups are typically executed off hours, but many organizations execute resource intensive batch processes which are critical to the core business for the subsequent day.  With staff members stretched to meet numerous needs, validating that the jobs have executed successfully on a daily basis can be time consuming, but it is often better to know about the failures ahead of time rather than having the users notify IT.  The typical solution to determine if a job fails is to notify a SQL Server operator, but SQL Server Agent mail is not always as reliable as needed.  As such, in this tip we will provide scripts to determine recent SQL Server Agent Job failures.

Solution
Since SQL Server stores the Job information in a set of tables in the MSDB database, it is possible to query these tables to determine the status of the Jobs.  As such, below outlines the Job related tables in the MSDB database:

SQL Server Agent Tables

ID Purpose SQL Server 2000 Table SQL Server 2005 Table
1 Primary table for job related information MSDB.dbo.sysjobs MSDB.dbo.sysjobs
2 Entry for each step in a specific job MSDB.dbo.sysjobsteps MSDB.dbo.sysjobsteps
3 Schedule(s) for each job MSDB.dbo.sysjobschedules MSDB.dbo.sysjobschedules
4 Local or remote servers where the job executes MSDB.dbo.sysjobservers MSDB.dbo.sysjobservers
5 Historical record of the job's execution MSDB.dbo.sysjobhistory MSDB.dbo.sysjobhistory
6 Current job status, next run date\time, queued date, etc. Not applicable MSDB.dbo.sysjobactivity
7 Historical job step log information for all job steps configured to write to this table Not applicable MSDB.dbo.sysjobstepslogs

SQL Server 2000 and 2005 Code Snippets

SQL Server 2000 Code Snippet

-- Variable Declarations
DECLARE @PreviousDate datetime
DECLARE @Year VARCHAR(4)
DECLARE @Month VARCHAR(2)
DECLARE @MonthPre VARCHAR(2)
DECLARE @Day VARCHAR(2)
DECLARE @DayPre VARCHAR(2)
DECLARE @FinalDate INT

-- Initialize Variables
SET @PreviousDate DATEADD(dd, -7GETDATE()) -- Last 7 days 
SET @Year DATEPART(yyyy@PreviousDate
SELECT @MonthPre CONVERT(VARCHAR(2), DATEPART(mm@PreviousDate))
SELECT @Month RIGHT(CONVERT(VARCHAR, (@MonthPre 1000000000)),2)
SELECT @DayPre CONVERT(VARCHAR(2), DATEPART(dd@PreviousDate))
SELECT @Day RIGHT(CONVERT(VARCHAR, (@DayPre 1000000000)),2
SET @FinalDate CAST(@Year @Month @Day AS INT)

-- Final Logic
SELECT   j.[name],
         
s.step_name,
         
h.step_id,
         
h.step_name,
         
h.run_date,
         
h.run_time,
         
h.sql_severity,
         
h.message,
         
h.server
FROM     msdb.dbo.sysjobhistory h
         
INNER JOIN msdb.dbo.sysjobs j
           
ON h.job_id j.job_id
         
INNER JOIN msdb.dbo.sysjobsteps s
           
ON j.job_id s.job_id
WHERE    h.run_status -- Failure
         
AND h.run_date @FinalDate
ORDER BY h.instance_id 
DESC

 

SQL Server 2005 Code Snippet

-- Variable Declarations
DECLARE @PreviousDate datetime
DECLARE @Year VARCHAR(4)
DECLARE @Month VARCHAR(2)
DECLARE @MonthPre VARCHAR(2)
DECLARE @Day VARCHAR(2)
DECLARE @DayPre VARCHAR(2)
DECLARE @FinalDate INT

-- Initialize Variables
SET @PreviousDate DATEADD(dd, -7GETDATE()) -- Last 7 days 
SET @Year DATEPART(yyyy@PreviousDate
SELECT @MonthPre CONVERT(VARCHAR(2), DATEPART(mm@PreviousDate))
SELECT @Month RIGHT(CONVERT(VARCHAR, (@MonthPre 1000000000)),2)
SELECT @DayPre CONVERT(VARCHAR(2), DATEPART(dd@PreviousDate))
SELECT @Day RIGHT(CONVERT(VARCHAR, (@DayPre 1000000000)),2
SET @FinalDate CAST(@Year @Month @Day AS INT)

-- Final Logic
SELECT   j.[name],
         
s.step_name,
         
h.step_id,
         
h.step_name,
         
h.run_date,
         
h.run_time,
         
h.sql_severity,
         
h.message,
         
h.server
FROM     msdb.dbo.sysjobhistory h
         
INNER JOIN msdb.dbo.sysjobs j
           
ON h.job_id j.job_id
         
INNER JOIN msdb.dbo.sysjobsteps s
           
ON j.job_id s.job_id
          
AND h.step_id = s.step_id
WHERE    h.run_status -- Failure
         
AND h.run_date @FinalDate
ORDER BY h.instance_id 
DESC

 

 

Next Steps

Readers Who Read This Tip Also Read Free Live Webcast Comment or Ask Questions About This Tip


Sponsor Information
Free SQL Server performance monitoring dashboard – Idera SQL check

Try Red Gate SQL Backup Pro for smaller, more robust SQL Server backups. Download a free trial now!

You don't know, what you don't know about SQL Server... Customized Consulting and Training

Do you love MSSQLTips and wish there was a SharePoint version?

Free whitepaper - Ten Things DBAs Need to Know About Storage


Get Our Tips Newsletter

We keep 50,000+ SQL Server professionals informed.



Red Gate Software - SQL Data Generator

Test your database until it cries… “Red Gate’s SQL Data Generator has overnight become the principal tool we use for loading test data to run our performance and load tests.” Grant Fritchey, FM Global.

Download now!

More SQL Server Tools
SQL defrag manager

SQL Backup

SQL comparison toolset

SQL secure

SQL safe backup




Copyright (c) 2006-2010 Edgewood Solutions, LLC All rights reserved
privacy statement | disclaimer | copyright | advertise | write for mssqltips | feedback | about
Some names and products listed are the registered trademarks of their respective owners.


CareerQandA.com | MSSharePointTips.com | MSSQLTips.com