Chinaunix首页 | 论坛 | 博客
  • 博客访问: 687774
  • 博文数量: 147
  • 博客积分: 5347
  • 博客等级: 大校
  • 技术积分: 1453
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-06 11:11
文章分类

全部博文(147)

文章存档

2014年(4)

2012年(9)

2011年(5)

2010年(28)

2009年(21)

2008年(29)

2007年(15)

2006年(17)

2005年(19)

我的朋友

分类: 数据库开发技术

2007-12-14 10:48:23

Finding SQL Server Agent Job Failures

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:

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

SQL Server 2000 and 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
WHERE    h.run_status 
-- Failure
         
AND h.run_date 
@FinalDate
ORDER BY h.instance_id DESC
阅读(1187) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~