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

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

Прямо сейчас у меня есть установка задания для выполнения один раз в день, таким образом, у меня есть параметр по умолчанию, что, если это является пустым, я установил ее на 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
8
задан Nick Kavadias 22 January 2010 в 10:31
поделиться

3 ответа

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

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

0
ответ дан 5 December 2019 в 07:58
поделиться

нужные вам таблицы - это 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
16
ответ дан 5 December 2019 в 07:58
поделиться

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

Вы в основном нужно запросить таблицу систем системы и получить значения от 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')
2
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: