SQL 服务器:按执行分组的作业历史记录

SQL Server : job history group by execution

SQL Server jobs history - job execution id?的副本 因为还没有解决方案

我需要复制 SSMS 作业历史记录。仅显示作业名称、执行日期、状态和持续时间

到目前为止,table像sysjobhistory一样没有关于如何通过执行对实例进行分组的信息。

然后是 sysjobactivity table:

我只是不明白为什么有时值是 NULL

有办法解决吗?

似乎人们总是忘记 SSMS 没有对 SQL 服务器的一些 special/magical 洞察力。

您可以通过启动探查器并打开作业历史记录来了解 SSMS 如何获取所有信息 window。

削减SQL代码(从Profiler获得)如下:

declare @tmp_sp_help_jobhistory table( ..... )

insert into @tmp_sp_help_jobhistory 
exec msdb.dbo.sp_help_jobhistory 
    @job_id = '9c6901d0-b325-4d14-bd88-22bb50c323af',
    @mode='FULL' 

SELECT
    tshj.instance_id AS [InstanceID],
    tshj.sql_message_id AS [SqlMessageID],
    tshj.message AS [Message],

.....

FROM @tmp_sp_help_jobhistory as tshj
ORDER BY [InstanceID] ASC

查看 sp_help_jobhistory 的代码,您会发现它调用了 sp_help_jobhistory_full。 SQL 代码非常简单。

仔细查看输出,您会发现作业总是从第 1 步开始到第 0 步结束(摘要详细信息)。要生成组编号:

WITH JobData AS(
    SELECT sjh.instance_id, -- This is included just for ordering purposes
     sj.job_id,
     sj.name AS job_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,
     sjh.retries_attempted,
     sjh.server,
     -- Every Job has Step 1 (starting step) and Step 0 (Job outcome details)
     -- Calculate Groups based on this
     ROW_NUMBER() OVER ( PARTITION BY step_id ORDER BY instance_id ) AS StepRn
    FROM msdb.dbo.sysjobhistory AS sjh
        INNER JOIN msdb.dbo.sysjobs_view AS sj ON sj.job_id = sjh.job_id
),
JobDataWithGroups AS(
    SELECT a.*, FirstStep.StepRn AS JobRunNumber
    FROM JobData AS a
        -- Get First Step Group Number
        CROSS APPLY( SELECT TOP 1 StepRn FROM JobData AS FirstStep WHERE FirstStep.instance_id <= a.instance_id AND FirstStep.step_id = 1 ORDER BY instance_id DESC ) AS FirstStep
)
SELECT *
FROM JobDataWithGroups
ORDER BY instance_id

输出