如何通过T-SQL查询提取SQL Server作业分步执行历史?
解决SQL Server作业历史按步骤拆分查询的方法
可以直接查询MSDB数据库中的系统表来关联作业步骤和历史记录,替代系统存储过程的不足。核心是通过job_id和step_id字段关联sysjobhistory(作业历史)、sysjobsteps(作业步骤)和sysjobs(作业基本信息)三张表。
示例查询语句
USE msdb; GO SELECT j.name AS 作业名称, js.step_name AS 步骤名称, js.step_id AS 步骤ID, run_date AS 执行日期, run_time AS 执行时间, -- 转换run_date和run_time为标准日期时间格式 CONVERT(DATETIME, CONVERT(VARCHAR(8), run_date) + ' ' + STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(6), run_time), 6), 3, 0, ':'), 6, 0, ':') ) AS 开始执行时间, run_duration AS 执行时长(秒), -- 状态码说明:0=成功,1=失败,2=重试,3=取消,4=正在运行 CASE run_status WHEN 0 THEN '成功' WHEN 1 THEN '失败' WHEN 2 THEN '重试' WHEN 3 THEN '取消' WHEN 4 THEN '正在运行' ELSE '未知' END AS 执行状态, message AS 执行消息 FROM dbo.sysjobhistory h INNER JOIN dbo.sysjobsteps js ON h.job_id = js.job_id AND h.step_id = js.step_id INNER JOIN dbo.sysjobs j ON h.job_id = j.job_id WHERE h.job_id = N'blahblahblah' -- 替换为你的目标作业ID ORDER BY run_date DESC, run_time DESC, step_id ASC;
关键说明
sysjobhistory:存储作业及每个步骤的执行历史,step_id对应具体步骤(0代表作业整体汇总记录,1及以上对应单个步骤)sysjobsteps:存储作业的所有步骤定义,通过job_id和step_id与历史表关联- 日期转换:系统表中
run_date(YYYYMMDD格式)和run_time(HHMMSS格式)为整数类型,转换为标准datetime格式更便于外部应用解析 - 过滤步骤级记录:如果只需要单个步骤的历史,可在WHERE条件中添加
h.step_id > 0,排除作业整体的汇总行
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

