【问题标题】:Retrieving the an SQL Agent job's specific error检索 SQL 代理作业的特定错误
【发布时间】:2010-03-29 11:02:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server database sql-server-2005


    【解决方案1】:

    尝试使用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)
    

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多