如何知道当前正在运行的作业的状态

Ton*_*nyP 51 t-sql sql-server sql-server-2008 sql-agent

我需要知道给定的作业当前是否在Ms SQL 2008服务器上运行.因此,不要再次调用可能导致并发问题的相同工作.

Ada*_*ger 66

看起来你可以使用msdb.dbo.sysjobactivity,检查具有非null start_execution_date和null stop_execution_date的记录,这意味着作业已经启动,但尚未完成.

这将为您提供当前正在运行的作业:

SELECT sj.name
   , sja.*
FROM msdb.dbo.sysjobactivity AS sja
INNER JOIN msdb.dbo.sysjobs AS sj ON sja.job_id = sj.job_id
WHERE sja.start_execution_date IS NOT NULL
   AND sja.stop_execution_date IS NULL
Run Code Online (Sandbox Code Playgroud)

  • 这会报告我的服务器上的一些非运行作业. (31认同)
  • 我在这里得到了一个更好的答案http://dba.stackexchange.com/questions/58859/script-to-see-running-jobs-in-sql-server-with-job-start-time,见Kenneth Fisher的回答仅返回当前正在运行的作业 (9认同)
  • 这包括已经开始但由于错误而未完成的工作.`EXEC msdb.dbo.sp_help_job`效果更好 (3认同)
  • 我只是觉得,当我看到这个答案有问题时,我应该说些什么,以免将来的人们绝对不要直面它。我现在已经不得不从这个话题继续前进。 (2认同)

Nir*_*raj 35

我找到了Kenneth Fisher更好答案.以下查询仅返回当前正在运行的作业:

SELECT
    ja.job_id,
    j.name AS job_name,
    ja.start_execution_date,      
    ISNULL(last_executed_step_id,0)+1 AS current_executed_step_id,
    Js.step_name
FROM msdb.dbo.sysjobactivity ja 
LEFT JOIN msdb.dbo.sysjobhistory jh ON ja.job_history_id = jh.instance_id
JOIN msdb.dbo.sysjobs j ON ja.job_id = j.job_id
JOIN msdb.dbo.sysjobsteps js
    ON ja.job_id = js.job_id
    AND ISNULL(ja.last_executed_step_id,0)+1 = js.step_id
WHERE
  ja.session_id = (
    SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC
  )
AND start_execution_date is not null
AND stop_execution_date is null;
Run Code Online (Sandbox Code Playgroud)

您可以通过msdb.dbo.sysjobactivity在select子句中的表中添加更多列来获取有关作业的更多信息.

  • 此脚本的一个重要特性是它仅选择在当前SQL代理会话中运行的作业.在先前的SQL代理会话结束时运行的作业也将具有NULL stop_execution_date.我们想要排除那些,因此`ja.session_id =(SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC) (4认同)

Fra*_*isi 15

给定一份工作(我假设你知道它的名字),你可以使用:

EXEC msdb.dbo.sp_help_job @Job_name = 'Your Job Name'
Run Code Online (Sandbox Code Playgroud)

正如MSDN作业帮助过程中所建议的那样.它返回有关作业的许多信息(所有者,服务器,状态等).


小智 13

EXEC msdb.dbo.sp_help_job @Job_name = 'Your Job Name'
Run Code Online (Sandbox Code Playgroud)

检查字段execution_status

0 - 仅返回非空闲或暂停的作业.
1 - 执行.
2 - 等待线程.
3 - 重试之间.
4 - 闲着.
5 - 暂停.
7 - 执行完成操作.

如果需要执行结果,请检查字段last_run_outcome

0 =失败
1 =成功
3 =取消
5 =未知

https://msdn.microsoft.com/en-us/library/ms186722.aspx