2016-11-04 3 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 будет искать на уровне строки, а не на уровне столбца (и, следовательно, возвращает мне два результата, один для статуса не удалось, а другой для статуса успешно для той же работы). Есть ли способ, по которому я могу вернуть только последнюю информацию о запуске для вышеуказанных заданий?

+0

Я попытался с помощью ключевого слова TOP. Но, к сожалению, он не возвращает статус моего дифференциального резервного копирования и полной резервной копии. Мне было интересно, есть ли способ устранить дубликат, основанный на самом названии работы. –

ответ

1

Я добавил следующие изменения:

Благодаря sysjobhistory сохраняет run_date и run_time с использованием двух различных (INT) полей, то возможно, что SELECT Top 1 [instance_id] ... order by [run_date] desc не возвращает нужную строку.

Чтобы решить, что я изменил его:

order by dbo.agent_datetime(run_date,run_time) desc 

, которая возвращает значение datetime с использованием как [run_date] и [run_time]

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

Смежные вопросы