2017-05-30 33 views
0

私が欲しいことをするためにクエリを書くのに問題があります。 SQL Serverには、msdb.dbo.sysjobhistoryというシステムテーブルがあります。これには、サーバーで実行され、操作を実行するSQLエージェント・ジョブの履歴が含まれています。表の各行は、ジョブのステップに対応しています。 run_statusというテーブルには、ジョブが完了してテーブルに書き込まれたときの結果を示す整数値を取得するカラムがあります。SQL Serverとsysjobhistory run_statusクエリ

私はいくつかのレポートと簡単なクエリでこの表の情報を追跡します。私は先週、興味深い事例を発見しました。この表では、各行がジョブのステップであっても、全体的な結果として機能するジョブのステップ0のエントリがあります。通常、私はステップ0の行を見て、ジョブの行のrun_statusを取得し、それを結果として使用します。ただし、ジョブのステップが「失敗」ステータスを持つ可能性はありますが、ステップ0の全体的なジョブ結果は「成功」ステータスになります。私はこのような状況を探すために、次のクエリを思い付いた:

SELECT job_id, step_id, step_name, run_date, run_time, run_status, W.parent_status 
FROM msdb.dbo.sysjobhistory [H] 
CROSS APPLY 
(SELECT TOP 1 run_status AS parent_status 
    FROM msdb.dbo.sysjobhistory 
    WHERE job_id = H.job_id 
    AND run_date <= H.run_date 
    AND step_id = 0 
    AND (CASE WHEN run_date = H.run_date THEN run_Time ELSE H.run_time END) <= H.run_time 
    ORDER BY run_date DESC, run_time DESC 
) AS [W] 
ORDER BY run_date, run_time, step_id 

ある特定のjob_idには、次のような結果セット与えるこのクエリ:この状況で

job_id | step_id | step_name | run_date | run_time | run_status | parent_status 
------------------------------------------------------------------------------- 
A12345 | 0 | (outcome) | 20170112 | 40000 | 1   | 1 
A12345 | 1 | step 1 | 20170112 | 43000 | 1   | 1 
A12345 | 2 | step 2 | 20170112 | 50000 | 0   | 1 
A12345 | 3 | step 3 | 20170112 | 53000 | 1   | 1 

のrun_statusを0は失敗を意味し、1のrun_statusは成功を意味する。 私はこのテーブルを持っていますので、実際に何が起こったのかを知るために使っていきたいと思います。私はCASE文または必要なときにステップ0のrun_statusを "上書き"する同様のものを作る必要があります。したがって、上記の状況が発生した場合、代わりにrun_statusに2の値を設定したいとします。だから今、私はただの仕事の成果の手順を照会するとき、私は上記の仕事のためにこのような何かを取得したい:

job_id | step_id | step_name | run_date | run_time | run_status 
--------------------------------------------------------------- 
A12345 | 0 | (outcome) | 20170112 | 40000 |  2 

を私は何をしたいのかを知って、私はちょうどそれを行うにはSQLの記述方法を確認していません。私は何とか親ステータスをすべてのrun_status結果と比較する必要があります。親ステータス= 1およびrun_status = 0の場合は、ステップ0のrun_statusを変更してください。

答えて

1
select 
    (case when sh.run_status = 1 and tt.job_id is not null then 2 else sh.run_status end) as run_status 
    , * 
from dbo.sysjobhistory sh 
    outer apply (
     select 
      top (1) 
      tsh.job_id 
     from dbo.sysjobhistory tsh 
     where sh.job_id = tsh.job_id 
      and sh.step_id <> tsh.step_id 
      and tsh.run_status = 0 
    ) tt