Ви щось гуглили, і ось програмне забезпечення, яке може вас зацікавити:
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. Чому ця публікація така чудова? Це так чудово, тому що Брент подумав, що якщо ви будете запитувати лише таблиці sysjobs та sysjobhistory, ви не отримаєте точного поточного статусу роботи. Тобто в таблиці sysjobhistory у вас є стовпець run_status (хоча згідно BOL можливі значення для цього стовпця є «Статус виконання завдання: 0 = Не вдалося, 1 = Успішно, 2 = Повторити, 3 = Скасовано, 4 = В процесі ») насправді значення ніколи не буде 4 (У процесі). Власне, в таблиці систематичної історії зберігаються історичні дані про кожен виконаний крок завдання, що означає, що стан кроку оновлюється лише після виконання наступного кроку. Іншими словами, таблиця НЕ оновлюється в режимі реального часу, ані кожної другої секунди.
Отже, Брент зрозумів, що існує незадокументована збережена процедура sys.xp_sqlagent_enum_jobs, яка є частиною sp_help_job, яка може надати поточний статус виконання Агентської роботи.
Незважаючи на те, що я знайшов спосіб отримати роботу, що працює в даний час, я не був задоволений цим сценарієм, оскільки він працює лише в SQL 2005/2008.
Що мені робити, якщо у мене є екземпляр SQL 2000 і мені дуже цікаво виконувати поточні завдання?
За допомогою допомоги Тіма Чапмена (майстра www.SQLServerNation.com) я зрозумів, як це зробити. ДЯКУЮ, Тим!
Ось підсумковий сценарій, який запускатиметься в SQL 2000, 2005 та 2008 роках, і який дасть вам поточні завдання агента SQL Server. (Як ви бачите, різниця у сценарії Brent дуже мала: замість "sys.xp_sqlagent_enum_jobs" я використовую "master.dbo.xp_sqlagent_enum_jobs"), і я обмежую набір результатів отримувати лише поточні завдання, використовуючи "де x .ріння = 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