sql-server - 检索 SQL 代理作业的特定错误

标签 sql-server database sql-server-2005

我正在使用 msdb..sp_help_job 来访问作业是成功还是失败,并且可以检索一般错误。

但是,我想访问失败步骤的特定错误。我似乎找不到它。它不在 MS 提供的有用存储过程列表中 http://msdn.microsoft.com/en-us/library/ms187763%28v=SQL.100%29.aspx

运行查询的帐户是有限的,但确实具有 SQLUserAgent 角色并拥有它正在访问的作业。

最佳答案

尝试使用 sp_help_jobhistory (Transact-SQL)

EXECUTE MSDB.DBO.SP_HELP_JOBHISTORY NULL,'your_job_name_here', @MODE = N'FULL'

你要的信息在sysjobhistory (Transact-SQL) .如果查看 SP_HELP_JOBHISTORY 的源代码,您会发现它调用 sp_help_jobhistory_full,然后使用 sysjobhistory:

USE [msdb]
GO
/****** Object:  StoredProcedure [dbo].[sp_help_jobhistory_full]    Script Date: 03/29/2010 07:58:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[sp_help_jobhistory_full]
               @job_id               UNIQUEIDENTIFIER,
               @job_name             sysname,
               @step_id              INT,
               @sql_message_id       INT,
               @sql_severity         INT,
               @start_run_date       INT,
               @end_run_date         INT,
               @start_run_time       INT,
               @end_run_time         INT,
               @minimum_run_duration INT,
               @run_status           INT,
               @minimum_retries      INT,
               @oldest_first         INT,
               @server               sysname,
               @mode                 VARCHAR(7),
               @order_by             INT,
               @distributed_job_history BIT
AS
IF(@distributed_job_history = 1)
  SELECT null as instance_id, 
     sj.job_id,
     job_name = sj.name,
     null as step_id,
     null as step_name,
     null as sql_message_id,
     null as sql_severity,
     sjh.last_outcome_message as message,
     sjh.last_run_outcome as run_status,
     sjh.last_run_date as run_date,
     sjh.last_run_time as run_time,
    sjh.last_run_duration as run_duration,
     null as operator_emailed,
     null as operator_netsentname,
     null as operator_paged,
     null as retries_attempted,
     sts.server_name as server
  FROM msdb.dbo.sysjobservers                sjh
  JOIN msdb.dbo.systargetservers sts ON (sts.server_id = sjh.server_id)
  JOIN msdb.dbo.sysjobs_view     sj  ON(sj.job_id = sjh.job_id)
  WHERE 
  (@job_id = sjh.job_id)
  AND ((@start_run_date       IS NULL) OR (sjh.last_run_date >= @start_run_date))
  AND ((@end_run_date         IS NULL) OR (sjh.last_run_date <= @end_run_date))
  AND ((@start_run_time       IS NULL) OR (sjh.last_run_time >= @start_run_time))
  AND ((@minimum_run_duration IS NULL) OR (sjh.last_run_duration >= @minimum_run_duration))
  AND ((@run_status           IS NULL) OR (@run_status = sjh.last_run_outcome))
  AND ((@server               IS NULL) OR (sts.server_name = @server))
ELSE
  SELECT sjh.instance_id, -- This is included just for ordering purposes
     sj.job_id,
     job_name = sj.name,
     sjh.step_id,
     sjh.step_name,
     sjh.sql_message_id,
     sjh.sql_severity,
     sjh.message,
     sjh.run_status,
     sjh.run_date,
     sjh.run_time,
     sjh.run_duration,
     operator_emailed = so1.name,
     operator_netsent = so2.name,
     operator_paged = so3.name,
     sjh.retries_attempted,
     sjh.server
  FROM msdb.dbo.sysjobhistory                sjh
     LEFT OUTER JOIN msdb.dbo.sysoperators so1  ON (sjh.operator_id_emailed = so1.id)
     LEFT OUTER JOIN msdb.dbo.sysoperators so2  ON (sjh.operator_id_netsent = so2.id)
     LEFT OUTER JOIN msdb.dbo.sysoperators so3  ON (sjh.operator_id_paged = so3.id),
     msdb.dbo.sysjobs_view sj
  WHERE (sj.job_id = sjh.job_id)
  AND ((@job_id               IS NULL) OR (@job_id = sjh.job_id))
  AND ((@step_id              IS NULL) OR (@step_id = sjh.step_id))
  AND ((@sql_message_id       IS NULL) OR (@sql_message_id = sjh.sql_message_id))
  AND ((@sql_severity         IS NULL) OR (@sql_severity = sjh.sql_severity))
  AND ((@start_run_date       IS NULL) OR (sjh.run_date >= @start_run_date))
  AND ((@end_run_date         IS NULL) OR (sjh.run_date <= @end_run_date))
  AND ((@start_run_time       IS NULL) OR (sjh.run_time >= @start_run_time))
  AND ((@end_run_time         IS NULL) OR (sjh.run_time <= @end_run_time))
  AND ((@minimum_run_duration IS NULL) OR (sjh.run_duration >= @minimum_run_duration))
  AND ((@run_status           IS NULL) OR (@run_status = sjh.run_status))
  AND ((@minimum_retries      IS NULL) OR (sjh.retries_attempted >= @minimum_retries))
  AND ((@server               IS NULL) OR (sjh.server = @server))
  ORDER BY (sjh.instance_id * @order_by)

关于sql-server - 检索 SQL 代理作业的特定错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2537355/

相关文章:

mysql - 从另一个表 `title`引用 `title`

android - Android 应用程序的中央数据库

asp.net-mvc - 对于多个网站和大型应用程序来说, Entity Framework 是一个糟糕的选择吗?

c# - 我们可以在 'app.config' 文件中声明变量吗?

sql-server - 在 SQL 查询中运行 .sql 文件

Python算法对大块数据进行排序

c# - subsonic 3.0,SqlServer默认值不起作用?

sql-server - SQL Server 中 SYSDATETIME 数据类型的准确性

sql - 查询以查找子字符串的所有匹配行

sql - 如何通过一个查询从单个列中获取多个 COUNT?