获取上次成功上班的日期?

Dav*_*ave 8 sql-server sql-server-agent

我有一个执行存储过程的步骤作业.我想获得上次成功执行作业的日期,以便我可以更新delta而不是整个数据集.

现在我的作业设置每天运行一次,所以我有一个默认参数,如果它为null我将它设置为GETDATE() - 1所以我还在更新delta但是我想要做的是设置上次成功执行作业的日期.

exec dbo.usp_UpdateFrom @LastSuccessfulExecutionTime
Run Code Online (Sandbox Code Playgroud)

目前的程序是这样的

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
Run Code Online (Sandbox Code Playgroud)

Nic*_*ias 16

你想要的表是sysjobssysjobhistorymsdb.虽然被警告!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
Run Code Online (Sandbox Code Playgroud)


Dav*_*ave 0

使用来自以下线程的信息:

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
Run Code Online (Sandbox Code Playgroud)

我对此不是特别满意,但我更喜欢这种根据作业名称获取 job_id 的方法。