2016-11-04 7 views
0

以下のクエリを使用して、SQLでメンテナンスジョブのステータスを取得しようとしています。SQLメンテナンスジョブの最新実行時間を取得

USE msdb 
GO 
SELECT Distinct SJ.Name AS "Jobs/Sql ServerInstances", 
CONVERT(date, getdate(),101) as "Date last monitored", 
SJH.run_date AS "Date last run", 
CASE SJH.run_status 
WHEN 0 THEN 'Failed' 
WHEN 1 THEN 'Successful' 
WHEN 3 THEN 'Cancelled' 
WHEN 4 THEN 'In Progress' 
END AS LastRunStatus 
FROM sysjobhistory SJH, sysjobs SJ 
WHERE SJH.job_id = SJ.job_id and SJH.run_date = 
(SELECT MAX(SJH1.run_date) FROM sysjobhistory SJH1 WHERE SJH.job_id = SJH1.job_id) 
and SJ.Name like '%DB%' 
ORDER BY SJH.run_date desc 

以下は、結果を返します。

Jobs/Sql ServerInstances Date last monitored Date last run LastRunStatus 
DB_BackuPlan.15min_trx  2016-11-04   20161104  Failed 
DB_BackuPlan.15min_trx  2016-11-04   20161104  Successful 
DB_BackuPlan.Differential 2016-11-04   20161104  Successful 
DB_BackuPlan.Full   2016-11-04   20161029  Successful 

ただし、トランザクションログバックアップの最新のレコードのみを返したいとします。 DISTINCTキーワードは列レベルではなく行レベルで検索されることを理解しています(したがって、2つの結果、1つは失敗したステータス、もう1つは同じジョブで成功したステータス)。 上記のジョブの最新の実行情報のみを返す方法はありますか? Iは、以下の変更を加えてきた

+0

[run_time]の両方を使用してdatetime値を返します

order by dbo.agent_datetime(run_date,run_time) desc 

それを解決するために

は、私はでそれを変更しました。残念ながら、差分バックアップと完全バックアップのステータスは返されません。私は、ジョブ名自体に基づいて重複を排除する方法があるのだろうかと思っていました。 –

答えて

1

:によりsysjobhistoryに

は、2つの異なる(INT)フィールドを使用run_dateと​​を保存し、SELECT Top 1 [instance_id] ... order by [run_date] desc、所望の行を返さない可能性があります。 [run_date]と私はTOPキーワードを使用してみました

use msdb 
go 

with jobs_cte as 
(
select 
    sj.[job_id] 
    ,sj.[name] 
    ,[date last monitored] = convert(datetime, getdate(), 101) 
    ,[instance_id] = (select top 1 [instance_id] 
         from [sysjobhistory] 
         where [sysjobhistory].job_id = sj.job_id 
         order by dbo.agent_datetime(run_date,run_time) desc) 
from 
    sysjobs sj 
where 
    sj.[name] like '%DB%' 
) 
select 
    jobs_cte.job_id 
    ,jobs_cte.[name] 
    ,[date last monitored] 
    , case [sjh].[run_status] 
     when 0 then 'Failed' 
     when 1 then 'Successful' 
     when 3 then 'Cancelled' 
     when 4 then 'In Progress' 
    end as [lastrunstatus] 
from 
    jobs_cte 
    left join sysjobhistory sjh 
     on jobs_cte.instance_id = sjh.instance_id 
+0

これは本当にうまくいった。ソリューションに感謝します。 –

+0

ようこそ。 – McNets

+0

@VivekKumarは答えに何か問題がありますか? – McNets

関連する問題