Получить дату последнего успешного выполнения задания? - PullRequest
8 голосов
/ 21 января 2010

У меня есть одношаговое задание, которое выполняет хранимую процедуру. Я хотел бы получить дату последнего успешного выполнения задания, чтобы я мог просто обновить дельту вместо всего набора данных.

Сейчас у меня есть настройка задания, которая запускается один раз в день, поэтому у меня есть параметр по умолчанию, который, если он пуст, я устанавливаю в GETDATE () - 1, поэтому я все еще обновляю дельту, но то, что я хотел бы do устанавливает дату последнего успешного выполнения задания.

exec dbo.usp_UpdateFrom @LastSuccessfulExecutionTime

Текущая процедура похожа на

CREATE PROCEDURE dbo.usp_UpdateFrom
    @FromDate datetime = NULL --would like to pass last successful execution time of the job
AS
    IF @FromDate IS NULL
        SET @FromDate = GETDATE() - 1

    -- do stuff
END

Ответы [ 5 ]

16 голосов
/ 22 января 2010

Нужны следующие таблицы: sysjobs и sysjobhistory in msdb. Хотя будь осторожен! SQL Server поддерживает только определенное количество записей, поэтому, если заданий слишком много, а история недостаточно велика, у вас не останется истории.

Следующий код извлекает job_id для данного имени задания и запрашивает таблицу истории для последнего успешно завершенного выполнения (т. Е. Шаг 0, состояние 1). Как видите, вы должны преобразовать время выполнения обратно в дату, поскольку SQL Server хранит ее в двух столбцах типа int:

DECLARE @job_id binary(16)
SELECT @job_id = job_id FROM msdb.dbo.sysjobs WHERE (name = N'YourJobName')

SELECT TOP 1
    CONVERT(DATETIME, RTRIM(run_date))
    + ((run_time / 10000 * 3600) 
    + ((run_time % 10000) / 100 * 60) 
    + (run_time % 10000) % 100) / (86399.9964) AS run_datetime
    , *
FROM
    msdb..sysjobhistory sjh
WHERE
    sjh.step_id = 0 
    AND sjh.run_status = 1 
    AND sjh.job_id = @job_id
ORDER BY
    run_datetime DESC
2 голосов
/ 16 ноября 2016

Поскольку sysjobhistory поддерживает только определенное количество записей, я рекомендую использовать sysjobactivity, в котором сохраняется "история" последнего выполнения каждого задания и сеанса.

SELECT TOP 1 start_execution_date
FROM msdb.dbo.sysjobactivity
WHERE run_requested_date IS NOT NULL
AND job_id = @job_id
ORDER BY session_id DESC;

ПРИМЕЧАНИЕ: Если задание не было выполнено в течение жизни сеанса, почти все значения будут null.

ТАКЖЕ существует система Хранимая процедура sp_help_job, которая возвращает эту информацию. Он принимает job_id, enabled и т. Д. В качестве параметров для возврата 1 или более записей.

2 голосов
/ 22 января 2010

Взгляните на эту статью, она может указать вам правильное направление. К сожалению, на моем домашнем компьютере нет SQL Server, поэтому я не могу его протестировать!

В основном вам нужно запросить таблицу sysjobactivity и получить значения из start_execution_date и stop_execution_date. Вам понадобится job_id, но я не уверен, откуда вы это получите.

Надеюсь, это поможет.

EDIT Хорошо, я провел еще несколько исследований и нашел следующий фрагмент кода

DECLARE @jobId binary(16)

SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE (name = N'Name of Your Job')
0 голосов
/ 19 сентября 2017

Для получения последних успешно выполненных заданий:

SELECT 
    h.[job_id]
    ,j.Name JobName
    ,CONVERT(CHAR(10), CAST(STR(run_date,8, 0) AS dateTIME), 111)   [LastRunDate]
   ,STUFF(STUFF(RIGHT('000000' + 
    CAST (run_time AS`` VARCHAR(6 ) ) ,6),5,0,':'),3,0,':') [LastRunTime]
   ,CASE run_status 
    WHEN 0 THEN 'Failed' 
    WHEN 1 THEN 'Succeeded' 
    WHEN 2 THEN 'Retry' 
    WHEN 3 THEN 'Cancelled' 
    WHEN 4 THEN 'In Progress' 
    END AS ExecutionStatus                                                 
    FROM [msdb].[dbo].[sysjobhistory] h 
    JOIN msdb.dbo.sysjobs j ON h.job_id=j.job_id 
    WHERE run_status=1 
    ORDER BY run_date DESC,run_time DESC
0 голосов
/ 22 января 2010

Использование информации из следующих тем:

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=112427 http://www.sqlservercentral.com/Forums/Topic542581-145-1.aspx

Это то, что я придумал ...

DECLARE 
    @statement nvarchar(72),
    @job_id uniqueidentifier,
    @last_run_date datetime

SET @statement = 'SET @guid = CAST(' + SUBSTRING(APP_NAME(), 30, 34) + ' as uniqueidentifier)'

EXECUTE sp_executesql @statement, N'@guid uniqueidentifier OUT', @guid = @job_id OUT

SELECT TOP (1)
    @last_run_date = CAST(STR(run_date, 8, 0) as datetime) + CAST(STUFF(STUFF(STR(run_time, 6, 0), 3, 0, ':'), 6, 0, ':') as datetime)
FROM msdb.dbo.sysjobhistory 
WHERE job_id = @job_id
AND run_status = 1
ORDER BY
    CAST(STR(run_date, 8, 0) as datetime) + CAST(STUFF(STUFF(STR(run_time, 6, 0), 3, 0, ':'), 6, 0, ':') as datetime) DESC

EXEC dbo.usp_UpdateFrom @last_run_date

Мне не очень удобно с этим, но я предпочитаю этот метод переопределения job_id в зависимости от имени вакансии.

...