我有一个执行存储过程的步骤作业。我想获得上次成功执行作业的日期,以便我可以更新delta而不是整个数据集。
现在我的作业设置每天运行一次,所以我有一个默认参数,如果它为null我将它设置为GETDATE() - 1所以我仍然更新delta但是我想要do将日期设置为上次成功执行作业。
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
答案 0 :(得分:16)
您想要的表格是msdb
中的sysjobs和sysjobhistory。虽然被警告! 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
答案 1 :(得分:2)
查看this文章,它可能会指向正确的方向。不幸的是我的家用机器上没有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')
答案 2 :(得分:2)
由于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
。
ALSO 系统存储过程 sp_help_job
会返回此信息。
它接受job_id
,enabled
等作为参数返回1个或多个记录。
答案 3 :(得分: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
我对此并不是特别熟悉,但我更喜欢这种根据作业名称获取job_id的方法。
答案 4 :(得分:0)
要获得上次成功运行的作业:
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