Получить дату последнего успешного выполнения задания?

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

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

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 ответов


таблицы, которые вы хотите sysjobs и sysjobhistory на 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

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

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

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

редактировать Ладно, я сделал еще кое-что. исследуйте и нашли следующий фрагмент кода

DECLARE @jobId binary(16)

SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE (name = N'Name of Your Job')

С 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, etc. в качестве параметров для возврата 1 или несколько записей.


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

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 в зависимости от имени задания.


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

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