У меня есть одноэтапное задание, которое выполняет хранимую процедуру. Я хотел бы, получают дату прошлого успешного времени выполнения задания так, чтобы я мог просто обновить дельту вместо полного набора данных.
Прямо сейчас у меня есть установка задания для выполнения один раз в день, таким образом, у меня есть параметр по умолчанию, что, если это является пустым, я установил ее на 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
Используя информацию из следующих потоков:
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, а не в зависимости от названия вакансии.
нужные вам таблицы - это 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 на моей домашней машине, так что не могу проверить это для вас!
Вы в основном нужно запросить таблицу систем системы и получить значения от 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')