dbo.sysjobhistory (Transact-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 = Succeeded2 = 重试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_date
列run_time
转换为名为 LastRunStartDateTime
datetime 列的日期/时间列。 该run_duration
列将转换为名为 LastRunDurationSeconds
Int 列的 int 列。 然后,这两列用于计算 。LastRunFinishDateTime
该 run_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