Jon*_*des 14 sql-server-2008 tools sql-server-agent
我发现用于管理代理作业的内置 MS SQL Studio 工具有点令人沮丧。您发现哪些工具有用?
顺便说一句,我想在这样的工具中看到三件事:
编写一个小应用程序来处理这个问题可能很简单,但肯定有人已经这样做了,而且做得更好。
这显然是一个主观问题,所以如果某种 mod 徘徊过去,请随意将其设为 CW。
win*_*ino 13
做了一些谷歌搜索,这里有一些你可能感兴趣的软件:
SQL 作业管理器 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 的一部分,可以给出 Agent Job 的当前执行状态。
尽管我找到了获取当前正在运行的作业的方法,但我对这个脚本并不满意,因为它只能在 SQL 2005 / 2008 上运行。
如果我有一个 SQL 2000 实例并且对当前正在运行的作业非常好奇,我该怎么办?
在 Tim Chapman(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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13741 次 |
最近记录: |