Sql server 获取上次成功运行作业的日期?
我有一个执行存储过程的单步作业。我想得到上一次成功执行作业的日期,这样我就可以只更新一个增量而不是整个数据集 现在我有一个每天运行一次的作业设置,所以我有一个默认参数,如果它为null,我将它设置为GETDATE()-1,因此我仍在更新增量,但我想做的是将日期设置为作业最后一次成功执行的日期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
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。