SQLサーバーがジョブ履歴階層をグループ化して、結果をすべてのジョブステップに関連付ける方法を理解しようとしています。ダッシュボードでエラーを追跡するためにデータ視覚化ツールを使用していますが、(ジョブの結果) ステップ全体が頭を悩ませています。
特定のジョブ実行のすべてのステップをリンクする ID はありませんか? は(ジョブの結果)instance_id + max(step_id)
を与えると思います。ログ ファイル ビューアーが拡張可能な階層で結果を表示することを考えると、データベース内でその階層を表現するための一貫した方法が必要であると考えられます。instance_id
step_id = 0
を使用するjob_id + run_date
と、すべてのステップが同じ日に完了する 1 日に 1 回しか発生しないジョブで機能しますが、ジョブが 1 日に複数回実行されるとうまくいきません。
基本的に、ジョブ履歴テーブルをそれ自体に結合し、ジョブ実行のジョブ結果を各ステップに結合して、視覚化ツールのログ ビューアーに表示されるような階層を構築できるようにします。
ログビューアのサンプル画像:
何か案は?
解決策を見つけました。重要なのは、ステップがジョブの開始時間とジョブの実行期間内にあることです。
`
select *
from
(
select sjh.run_date job_run_date
, jobs.name job_name
,dbo.agent_datetime(sjh2.run_date,sjh2.run_time) job_start_time
,CASE sjh2.run_status WHEN 0 THEN 'Job Failed' WHEN 1 THEN 'Job Succeeded' END job_status
,sjh2.message job_message
,STUFF(STUFF(STUFF(RIGHT(REPLICATE('0', 8) + CAST(sjh2.run_duration as varchar(8)), 8), 3, 0, ':'), 6, 0, ':'), 9, 0, ':') 'job_run_duration'
, sjh.step_id
, sjh.step_name
,dbo.agent_datetime(sjh.run_date,sjh.run_time) step_run_time
,CASE sjh.run_status WHEN 0 THEN 'Step Failed' WHEN 1 THEN 'Step Succeeded' END step_status
,sjh.message step_message
,STUFF(STUFF(STUFF(RIGHT(REPLICATE('0', 8) + CAST(sjh.run_duration as varchar(8)), 8), 3, 0, ':'), 6, 0, ':'), 9, 0, ':') 'step_run_duration'
-- , *
from sysjobhistory sjh
join sysjobs jobs on jobs.job_id = sjh.job_id
join sysjobhistory sjh2 on sjh2.run_date = sjh.run_date
and sjh2.job_id = sjh.job_id
and sjh2.step_id = 0
and sjh.run_time >= sjh2.run_time
and sjh.run_time <= sjh2.run_time + sjh2.run_duration
) t1
order by job_run_date desc, job_name desc, job_start_time, step_id
`