Answers:
进行了一些谷歌搜索,下面是一些您可能感兴趣的软件:
SQL Job Manager https://www.idera.com/productssolutions/freetools/sqljobmanager
查询当前正在运行的SQL Server代理作业 http://sqlconcept.com/2011/06/25/how-to-query-currently-running-sql-server-agent-jobs/
如果有人要添加更多链接,请继续!
对于第3点,链接查询和注释在此处-
今天,我继续寻找一种列出所有当前正在运行的SQL Server代理作业的方法。与其他任务一样,这也是从Google-ing开始的。:)
在2分钟内,我在SQLServerPedia上找到了Brent Ozar的这篇精彩文章。为什么这篇文章这么好?之所以如此出色是因为Brent认为,如果仅查询sysjobs和sysjobhistory表,您将无法获得准确的当前作业状态。即,在sysjobhistory表中,您有一列run_status,但是(即使根据BOL,此列的可能值为“作业执行的状态:0 =失败,1 =成功,2 =重试,3 =取消,4 =进行中”),则该值永远不会为4(进行中)。实际上,在sysjobhistory表中保留了每个执行的作业步骤的历史数据,这意味着该步骤的状态仅在执行下一个步骤之后才更新。换句话说,该表不是实时更新的,也不是每秒更新的。
因此,Brent发现存在一个未记录的存储过程sys.xp_sqlagent_enum_jobs,它是sp_help_job的一部分,可以提供代理作业的当前执行状态。
尽管我找到了一种获取当前正在运行的作业的方法,但我对该脚本不满意,因为该脚本仅在SQL 2005/2008上运行。
如果我有一个SQL 2000实例并且对当前正在运行的作业非常好奇该怎么办?
在蒂姆·查普曼的帮助下(www.SQLServerNation.com的主人),我找到了解决方法。谢谢你,蒂姆!
这是最终的脚本,它将在SQL 2000、2005和2008上运行,并为您提供当前正在运行的SQL Server代理作业。(您可以看到,与Brent脚本的区别很小:我使用的是“ master.dbo.xp_sqlagent_enum_jobs”,而不是“ sys.xp_sqlagent_enum_jobs”,并且我使用“ where x .running = 1”)。
就这么简单。请享用。
IF EXISTS (SELECT *
FROM tempdb.dbo.sysobjects
WHERE id = OBJECT_ID(N'[tempdb].[dbo].[Temp1]')
)
DROP TABLE [tempdb].[dbo].[Temp1]
GO
CREATE TABLE [tempdb].[dbo].[Temp1]
(
job_id uniqueidentifier NOT NULL,
last_run_date nvarchar (20) NOT NULL,
last_run_time nvarchar (20) NOT NULL,
next_run_date nvarchar (20) NOT NULL,
next_run_time nvarchar (20) NOT NULL,
next_run_schedule_id INT NOT NULL,
requested_to_run INT NOT NULL,
request_source INT NOT NULL,
request_source_id sysname
COLLATE database_default NULL,
running INT NOT NULL,
current_step INT NOT NULL,
current_retry_attempt INT NOT NULL,
job_state INT NOT NULL)
DECLARE @job_owner sysname
DECLARE @is_sysadmin INT
SET @is_sysadmin = isnull (is_srvrolemember ('sysadmin'), 0)
SET @job_owner = suser_sname ()
INSERT INTO [tempdb].[dbo].[Temp1]
--EXECUTE sys.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner
EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner
UPDATE [tempdb].[dbo].[Temp1]
SET last_run_time = right ('000000' + last_run_time, 6),
next_run_time = right ('000000' + next_run_time, 6);
-----
SELECT j.name AS JobName,
j.enabled AS Enabled,
CASE x.running
WHEN 1
THEN
'Running'
ELSE
CASE h.run_status
WHEN 2 THEN 'Inactive'
WHEN 4 THEN 'Inactive'
ELSE 'Completed'
END
END
AS CurrentStatus,
coalesce (x.current_step, 0) AS CurrentStepNbr,
CASE
WHEN x.last_run_date > 0
THEN
convert (datetime,
substring (x.last_run_date, 1, 4)
+ '-'
+ substring (x.last_run_date, 5, 2)
+ '-'
+ substring (x.last_run_date, 7, 2)
+ ' '
+ substring (x.last_run_time, 1, 2)
+ ':'
+ substring (x.last_run_time, 3, 2)
+ ':'
+ substring (x.last_run_time, 5, 2)
+ '.000',
121
)
ELSE
NULL
END
AS LastRunTime,
CASE h.run_status
WHEN 0 THEN 'Fail'
WHEN 1 THEN 'Success'
WHEN 2 THEN 'Retry'
WHEN 3 THEN 'Cancel'
WHEN 4 THEN 'In progress'
END
AS LastRunOutcome,
CASE
WHEN h.run_duration > 0
THEN
(h.run_duration / 1000000) * (3600 * 24)
+ (h.run_duration / 10000 % 100) * 3600
+ (h.run_duration / 100 % 100) * 60
+ (h.run_duration % 100)
ELSE
NULL
END
AS LastRunDuration
FROM [tempdb].[dbo].[Temp1] x
LEFT JOIN
msdb.dbo.sysjobs j
ON x.job_id = j.job_id
LEFT OUTER JOIN
msdb.dbo.syscategories c
ON j.category_id = c.category_id
LEFT OUTER JOIN
msdb.dbo.sysjobhistory h
ON x.job_id = h.job_id
AND x.last_run_date = h.run_date
AND x.last_run_time = h.run_time
AND h.step_id = 0
where x.running = 1
我知道这是一篇较旧的文章,而且我个人也遇到过同样的问题。在多个实例之间管理多个SQL代理作业,因此我决定创建SQL Agent Insight,可在此处找到http://brentec.ca。它是一个不断发展的产品,将在不久的将来退出beta版,并且会不断更新,并欢迎提出建议。这是我在业余时间从事的项目,也是我的全职工作,但是如果建议值得,那么它们将被运用于将来。
当前,它只是SQL Agent的监视工具,具有一定的脚本编写能力。当前版本为0.11,每年更新2-3,并提供联系信息以寻求帮助。是的,目前没有任何在线帮助,但是由于它几乎是一种只读产品,因此对受监视的SQL实例不会造成任何损害。
您尝试过报告功能吗?
右键单击SQL Agent =>报告=>标准报告