我有一个存储过程来安排工作.这项工作需要很长时间才能完成(大约30到40分钟).我需要了解这份工作的状态.以下细节对我有帮助
1)如何查看已安排在未来时间但尚未开始的所有作业的列表
2)如何查看正在运行的作业列表以及它们运行时的时间跨度
3)如何查看作业是否已成功完成或由于任何错误而在两者之间停止.
我想指出,此页面上的T-SQL都不能正常工作,因为它们都没有加入syssessions表只能获取当前会话,因此可能包含误报.
请参阅此参考:具有空停止日期的作业意味着什么?
您还可以通过分析msdb中的sp_help_jobactivity过程来验证这一点.
我意识到这是SO上的旧消息,但我发现这个消息只是部分有用,因为这个问题.
SELECT job.name, job.job_id, job.originating_server, activity.run_requested_date, DATEDIFF( SECOND, activity.run_requested_date, GETDATE() ) as Elapsed FROM msdb.dbo.sysjobs_view job JOIN msdb.dbo.sysjobactivity activity ON job.job_id = activity.job_id JOIN msdb.dbo.syssessions sess ON sess.session_id = activity.session_id JOIN ( SELECT MAX( agent_start_date ) AS max_agent_start_date FROM msdb.dbo.syssessions ) sess_max ON sess.agent_start_date = sess_max.max_agent_start_date WHERE run_requested_date IS NOT NULL AND stop_execution_date IS NULL
您可以尝试使用系统存储过程sp_help_job.这将返回有关作业,步骤,计划和服务器的信息.例如
EXEC msdb.dbo.sp_help_job @Job_name = 'Your Job Name'
SQL Books Online应包含有关其返回的记录的大量信息.
要返回有关多个作业的信息,您可以尝试查询以下系统表,这些表保存有关作业的各种信息
msdb.dbo.SysJobs
msdb.dbo.SysJobSteps
msdb.dbo.SysJobSchedules
msdb.dbo.SysJobServers
msdb.dbo.SysJobHistory
他们的名字是相当不言自明的(除了SysJobServers,它持有关于工作上次运行和结果的信息).
同样,可以在MSDN上找到有关字段的信息.例如,查看SysJobs的页面
这就是我用来获取正在运行的工作(主要是因为我可以杀死那些可能已挂起的工作):
SELECT job.Name, job.job_ID ,job.Originating_Server ,activity.run_requested_Date ,datediff(minute, activity.run_requested_Date, getdate()) AS Elapsed FROM msdb.dbo.sysjobs_view job INNER JOIN msdb.dbo.sysjobactivity activity ON (job.job_id = activity.job_id) WHERE run_Requested_date is not null AND stop_execution_date is null AND job.name like 'Your Job Prefix%'
正如Tim所说,MSDN/BOL文档在sysjobsX表的内容上相当不错.请记住它们是MSDB中的表.
-- Microsoft SQL Server 2008 Standard Edition: IF EXISTS(SELECT 1 FROM msdb.dbo.sysjobs J JOIN msdb.dbo.sysjobactivity A ON A.job_id=J.job_id WHERE J.name=N'Your Job Name' AND A.run_requested_date IS NOT NULL AND A.stop_execution_date IS NULL ) PRINT 'The job is running!' ELSE PRINT 'The job is not running.'