dbo.sysjobhistory (Transact-SQL)

适用于:SQL ServerAzure SQL 托管实例

包含有关按SQL Server 代理执行计划作业的信息。

注意

在大多数情况下,数据仅在作业步骤完成后更新,并且表通常不包含当前正在进行的作业步骤的记录。 在某些情况下,基础进程 确实 提供有关正在进行的作业步骤的信息。

此表存储在 msdb 数据库中。

列名称 数据类型 说明
instance_id int 行的唯一标识符。
job_id uniqueidentifier 作业 ID。
step_id int 作业中步骤的 ID。
step_name sysname 步骤的名称。
sql_message_id int 如果作业失败,则返回的任何 SQL Server 错误消息的 ID。
sql_severity int 任何 SQL Server 错误的严重性。
message nvarchar(4000) SQL Server 错误的文本(如果有)。
run_status int 作业的执行状态:

0 = 失败
1 = Succeeded
2 = 重试
3 = 已取消
4 = 正在进行中
run_date int 日期作业或步骤开始执行, yyyyMMdd 格式。 对于正在进行历史记录,此值是写入历史记录的日期和时间。
run_time int 作业或步骤以格式启动 HHmmss 的时间。
run_duration int 在长达 24 小时的时间段内执行作业或步骤 HHmmss 的执行中已用时间。 在示例中查找用于转换较长运行持续时间的代码。
operator_id_emailed int 作业完成时通知的操作员的 ID。
operator_id_netsent int 作业完成时用消息通知的操作员的 ID。
operator_id_paged int 作业完成时用寻呼通知的操作员的 ID。
retries_attempted int 尝试执行作业或步骤的重试次数。
server sysname 执行作业时所在服务器的名称。

示例

以下 Transact-SQL 查询将run_daterun_time转换为名为 LastRunStartDateTimedatetime 列的日期/时间列。 该run_duration列将转换为名为 LastRunDurationSecondsInt 列的 int 列。 然后,这两列用于计算 。LastRunFinishDateTimerun_duration 列也转换为更用户友好的格式。 可以在 SQL Server Management Studio 或 Azure Data Studio 中运行脚本。

SET NOCOUNT ON;

SELECT sj.name AS Name,
    sh.step_name AS StepName,
    shp.LastRunStartDateTime,
    DATEADD(SECOND, shp.LastRunDurationSeconds, shp.LastRunStartDateTime) AS LastRunFinishDateTime,
    shp.LastRunDurationSeconds,
    CASE
        WHEN sh.run_duration > 235959
            THEN CAST((CAST(LEFT(CAST(sh.run_duration AS VARCHAR),
                LEN(CAST(sh.run_duration AS VARCHAR)) - 4) AS INT) / 24) AS VARCHAR)
                    + '.' + RIGHT('00' + CAST(CAST(LEFT(CAST(sh.run_duration AS VARCHAR),
                LEN(CAST(sh.run_duration AS VARCHAR)) - 4) AS INT) % 24 AS VARCHAR), 2)
                    + ':' + STUFF(CAST(RIGHT(CAST(sh.run_duration AS VARCHAR), 4) AS VARCHAR(6)), 3, 0, ':')
        ELSE STUFF(STUFF(RIGHT(REPLICATE('0', 6) + CAST(sh.run_duration AS VARCHAR(6)), 6), 3, 0, ':'), 6, 0, ':')
        END AS [LastRunDuration (d.HH:MM:SS)],
    DATEADD(SECOND, shp.LastRunDurationSeconds, shp.LastRunStartDateTime) AS LastRunFinishDateTime
FROM msdb.dbo.sysjobs sj
INNER JOIN msdb.dbo.sysjobhistory sh ON sj.job_id = sh.job_id
CROSS APPLY (SELECT DATETIMEFROMPARTS(sh.run_date / 10000, -- years
        sh.run_date % 10000 / 100, -- months
        sh.run_date % 100, -- days
        sh.run_time / 10000, -- hours
        sh.run_time % 10000 / 100, -- minutes
        sh.run_time % 100, -- seconds
        0 -- milliseconds
    ) AS LastRunStartDateTime,
    (sh.run_duration / 10000) * 3600 -- convert hours to seconds, can be greater than 24
    + ((sh.run_duration % 10000) / 100) * 60 -- convert minutes to seconds
    + (sh.run_duration % 100) AS LastRunDurationSeconds
) AS shp;
GO