Получить дату последнего успешного выполнения задания?
у меня есть одно пошаговое задание, которое выполняет хранимую процедуру. Я хотел бы получить дату последнего успешного выполнения задания, чтобы я мог просто обновить дельту вместо всего набора данных.
прямо сейчас у меня есть настройка задания для запуска один раз в день, поэтому у меня есть параметр по умолчанию, если он равен 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