Busqué en Google y aquí hay algunos programas que pueden interesarte:
Administrador de trabajos de SQL
https://www.idera.com/productssolutions/freetools/sqljobmanager
Consultar trabajos actualmente en ejecución del Agente SQL Server
http://sqlconcept.com/2011/06/25/how-to-query-currently-running-sql-server-agent-jobs/
Si alguien tiene más enlaces para agregar, ¡adelante!
Para el punto 3, la consulta de enlace y las notas están aquí:
Hoy realicé una búsqueda para descubrir una manera de enumerar todos los trabajos que se ejecutan actualmente en el Agente SQL Server. Como cualquier otra búsqueda, esta también comenzó con Google. :)
En 2 minutos encontré esta gran publicación de Brent Ozar en SQLServerPedia. ¿Por qué esta publicación es tan genial? Es genial porque Brent pensó que si solo consulta las tablas sysjobs y sysjobhistory no obtendrá el estado actual exacto del trabajo. Es decir, en la tabla sysjobhistory tiene una columna run_status, sin embargo (aunque según el BOL los valores posibles para esta columna son "Estado de la ejecución del trabajo: 0 = Fallido, 1 = Correcto, 2 = Reintentar, 3 = Cancelado, 4 = En progreso ”) en realidad, el valor nunca será 4 (En progreso). En realidad, en la tabla sysjobhistory se guardan los datos históricos de cada paso de trabajo ejecutado, lo que significa que el estado del paso se actualiza solo después de ejecutar el siguiente paso. En otras palabras, la tabla NO se actualiza en tiempo real, ni cada segundo.
Entonces, Brent descubrió que hay un procedimiento almacenado no documentado sys.xp_sqlagent_enum_jobs, que es parte de sp_help_job, que puede proporcionar el estado de ejecución actual del trabajo del agente.
Aunque encontré una manera de obtener los trabajos actualmente en ejecución, no estaba contento con este script porque solo se ejecuta en SQL 2005/2008.
¿Qué debo hacer si tengo una instancia de SQL 2000 y tengo mucha curiosidad sobre los trabajos que se ejecutan actualmente?
Con un poco de la ayuda de Tim Chapman (el maestro de www.SQLServerNation.com) descubrí cómo hacerlo. GRACIAS Tim!
Aquí está la secuencia de comandos final, que se ejecutará en SQL 2000, 2005 y 2008, y que le dará los trabajos de agente de SQL Server que se ejecutan actualmente. (Como puede ver, la diferencia con el script de Brent es muy pequeña: en lugar de "sys.xp_sqlagent_enum_jobs" estoy usando "master.dbo.xp_sqlagent_enum_jobs" y estoy limitando el conjunto de resultados para obtener solo los trabajos actualmente en ejecución usando "where x .running = 1 ″).
Tan simple como es. Disfrutar.
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