Avez-vous fait des recherches sur Google et voici quelques logiciels qui pourraient vous intéresser:
Gestionnaire de travaux SQL
https://www.idera.com/productssolutions/freetools/sqljobmanager
Requête en cours d'exécution des travaux de l'Agent SQL Server
http://sqlconcept.com/2011/06/25/how-to-query-currently-running-sql-server-agent-jobs/
Si quelqu'un a d'autres liens à ajouter, allez-y!
Pour le point 3, la requête de lien et les notes sont ici -
Aujourd'hui, je suis parti à la recherche d'un moyen de répertorier tous les travaux de l'Agent SQL Server en cours d'exécution. Comme toutes les autres quêtes, celle-ci a également commencé avec Google. :)
En 2 minutes, j'ai trouvé cet excellent article de Brent Ozar sur SQLServerPedia. Pourquoi ce post est-il si génial? C'est tellement bien parce que Brent a pensé que si vous interrogez uniquement les sysjobs et les tables sysjobhistory, vous n'obtiendrez pas le statut actuel exact du travail. C'est-à-dire que dans la table sysjobhistory, vous avez une colonne run_status (même si, selon le BOL, les valeurs possibles pour cette colonne sont «Statut de l'exécution du travail: 0 = Échec, 1 = Réussi, 2 = Réessayer, 3 = Annulé, 4 = En cours ») en réalité, la valeur ne sera jamais 4 (En cours). En fait, dans la table sysjobhistory sont conservées les données historiques de chaque étape de travail exécutée, ce qui signifie que le statut de l'étape n'est mis à jour qu'après l'exécution de l'étape suivante. En d'autres termes, la table n'est PAS mise à jour en temps réel, ni toutes les deux secondes.
Ainsi, Brent a compris qu'il existe une procédure stockée non documentée sys.xp_sqlagent_enum_jobs, qui fait partie de sp_help_job, qui peut donner l'état d'exécution actuel du travail d'agent.
Même si j'ai trouvé un moyen d'obtenir les travaux en cours d'exécution, je n'étais pas satisfait de ce script car il ne fonctionne que sur SQL 2005/2008.
Que dois-je faire si j'ai une instance SQL 2000 et que je suis très curieux de connaître les travaux en cours d'exécution?
Avec un peu d'aide de Tim Chapman (le maître de www.SQLServerNation.com), j'ai compris comment le faire. MERCI, Tim!
Voici le script final, qui s'exécutera sur SQL 2000, 2005 et 2008, et qui vous donnera les travaux d'agent SQL Server en cours d'exécution. (Comme vous pouvez le voir, la différence avec le script de Brent est très petite: au lieu de «sys.xp_sqlagent_enum_jobs» j'utilise «master.dbo.xp_sqlagent_enum_jobs» et je limite le jeu de résultats pour obtenir uniquement les travaux en cours d'exécution en utilisant «où x .running = 1 ″).
C'est aussi simple que cela. Prendre plaisir.
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