当前位置:  开发笔记 > 数据库 > 正文

如何确定工作状态?

如何解决《如何确定工作状态?》经验,为你挑选了4个好方法。

我有一个存储过程来安排工作.这项工作需要很长时间才能完成(大约30到40分钟).我需要了解这份工作的状态.以下细节对我有帮助

1)如何查看已安排在未来时间但尚未开始的所有作业的列表

2)如何查看正在运行的作业列表以及它们运行时的时间跨度

3)如何查看作业是否已成功完成或由于任何错误而在两者之间停止.



1> efesar..:

我想指出,此页面上的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


这应该是答案.至少还有一个关于此问题的StackOverflow问题(此处:http://stackoverflow.com/questions/18445825/how-to-know-status-of-currently-running-jobs),其中一位评论者发现只是发现了sysjobactivity stop_execution_date为null的记录将包括几周之前显然还没有运行的run_requested_date的记录.我自己发现了同样的事情,当我查看卡住记录的session_ids时,我发现它们是以前的会话.上面运行@ efesar的查询排除了那些历史记录.

2> Tim C..:

您可以尝试使用系统存储过程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的页面


需要使用表msdb.dbo.sysjobactivity来实际确定作业当前是否正在运行.表*msdb.dbo.sysjobhistory显然只在*作业(或步骤?)完成后才填充* - 并且根本没有填充"手动"作业(即不是来自作业计划).

3> piers7..:

这就是我用来获取正在运行的工作(主要是因为我可以杀死那些可能已挂起的工作):

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中的表.



4> 小智..:
-- 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.'

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有