Sql server 获取上次成功运行作业的日期?

Sql server 获取上次成功运行作业的日期?,sql-server,sql-server-agent,Sql Server,Sql Server Agent,我有一个执行存储过程的单步作业。我想得到上一次成功执行作业的日期,这样我就可以只更新一个增量而不是整个数据集 现在我有一个每天运行一次的作业设置,所以我有一个默认参数,如果它为null,我将它设置为GETDATE()-1,因此我仍在更新增量,但我想做的是将日期设置为作业最后一次成功执行的日期 exec dbo.usp_UpdateFrom @LastSuccessfulExecutionTime 目前的程序类似于 CREATE PROCEDURE dbo.usp_UpdateFrom

我有一个执行存储过程的单步作业。我想得到上一次成功执行作业的日期,这样我就可以只更新一个增量而不是整个数据集

现在我有一个每天运行一次的作业设置,所以我有一个默认参数,如果它为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
看看这篇文章,它可能会为你指明正确的方向。不幸的是,我的家庭计算机上没有SQL Server,因此无法为您测试它

您基本上需要查询sysjobactivity表,并从start_execution_date和stop_execution_date获取值。你需要这份工作的身份证,但我不知道你从哪里得到的

我希望这有帮助

编辑 好的,我做了更多的研究,发现了下面的代码片段

DECLARE @jobId binary(16)

SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE (name = N'Name of Your Job')
所需的表位于和中
msdb
。尽管要小心!SQL Server只维护一定数量的记录,因此如果作业太多而历史记录不够大,则最终将没有历史记录

以下代码检索给定作业名称的
job\u 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

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

这就是我想到的

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

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

由于
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

还有一个返回此信息的系统存储过程。
它接受
job\u id
enabled
等作为参数,以返回1条或多条记录。

要获取上次成功运行的作业:

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

感谢您提供有关sysjobhistory的信息,不过我恐怕要依赖于作业名称。我想这对您来说可能更容易。没有工作名称就更简单了!是的,但我仍然需要得到这份工作。。您可以通过查看msdb..sysjobs并在脚本中对其进行硬编码来手动获取它?。除非删除作业,否则作业id不会更改。如果你不知道工作id是什么&它可能会改变,请坚持使用工作名。我提供的答案演示了如何在不依赖工作名的情况下获得工作id。