Scripts: Jobs no ejecutados en el último año / Actividad de Jobs Detallada
Hace unos días estuve buscando un script que me permitiera saber cuando fue la última ejecución de un job, para así poder revisar los jobs que llevaran más de 1 año sin ejecutarse y poder borrar los que no fueran necesarios, pero no encontré lo que buscaba por lo que tuve que crear uno.
He usado las columnas last_run_date y last_run_time de la tabla sysjobservers para sacar este dato, los scripts que encontré por Internet usaban otras columnas de otras tablas que paso a describir por qué no las elegí:
Scripts que usaban las columnas run_date y run_time de la tabla sysjobhistory, estas columnas muestran el tiempo de la última ejecución de los pasos de un job, esta opción podía ser válida pero no se eligió porque requería hacer un cálculo extra para obtener el último paso.
Scripts que usaban la columna run_requested_date de la tabla sysjobactivity, esta columna muestra el tiempo de ejecución de varias sesiones de un mismo job, esta opción podía ser válida pero no se eligió porque requería hacer un cálculo extra para obtener la última sesión.
Este es el Script:
/*--------------------------------------------------------------------------------------
-- Title: Jobs no ejecutados en el último año
-- Author: Fran Lens (http://www.lensql.net)
-- Date: 2012-02-15
-- Description: Esta consulta devuelve los jobs que no se han ejecutado en el último año
--------------------------------------------------------------------------------------*/
USE msdb
SELECT * FROM (
SELECT
[Job_Name] = j.name
,[Last_Run_Time] = CASE
WHEN js.last_run_date > 0 THEN substring(convert(varchar(8),js.last_run_date),1,4) +'-'+ substring(convert(varchar(8),js.last_run_date),5,2) +'-'+ substring(convert(varchar(8),js.last_run_date),7,2) +' '+
CASE len(js.last_run_time)
WHEN 6 THEN substring(convert(varchar(8),js.last_run_time),1,2) +':'+ substring(convert(varchar(8),js.last_run_time),3,2) +':'+ substring(convert(varchar(8),js.last_run_time),5,2)
WHEN 5 THEN +'0'+ substring(convert(varchar(8),js.last_run_time),1,1) +':'+ substring(convert(varchar(8),js.last_run_time),2,2) +':'+ substring(convert(varchar(8),js.last_run_time),4,2)
WHEN 4 THEN +'00:'+ substring(convert(varchar(8),js.last_run_time),1,2) +':'+ substring(convert(varchar(8),js.last_run_time),3,2)
WHEN 3 THEN +'00:0'+ substring(convert(varchar(8),js.last_run_time),1,1) +':'+ substring(convert(varchar(8),js.last_run_time),2,2)
WHEN 2 THEN +'00:00:'+ substring(convert(varchar(8),js.last_run_time),1,2)
WHEN 1 THEN +'00:00:0'+ substring(convert(varchar(8),js.last_run_time),1,1)
END
ELSE 'Never Executed'
END
,[Drop_Statement] = 'sp_delete_job @job_name = ' + '''' + j.name + ''''
FROM sysjobs j
INNER JOIN sysjobservers js on j.job_id = js.job_id
)as ttable
WHERE [Last_Run_Time] < (SELECT convert(varchar, getdate()-365, 121))
ORDER BY [Last_Run_Time]
Después de crear este script, me decidí a crear otro que mostrara toda la actividad realizada por los jobs, como si se tratase del Job Activity Monitor
Este es el otro Script:
/*--------------------------------------------------------------------------------------
-- Title: Actividad de Jobs Detallada
-- Author: Fran Lens (http://www.lensql.net)
-- Date: 2012-02-15
-- Description: Esta consulta devuelve información de la ejecuciones de los jobs, es parecido al Job Activity Monitor
--------------------------------------------------------------------------------------*/
USE msdb
SELECT * FROM (
SELECT
[Job_Name] = j.name
,[Owner] = sp.name
,[Job_Status] = CASE
WHEN j.enabled = 1 THEN 'Enabled'
ELSE 'Disabled'
END
,[Last_Run_Status] = CASE js.last_run_outcome
WHEN 0 THEN 'Failed'
WHEN 1 THEN 'Succeeded'
WHEN 3 THEN 'Cancelled'
WHEN 4 THEN 'In Progress'
WHEN 5 THEN 'Unknown'
END
,[Last_Run_Time] = CASE
WHEN js.last_run_date > 0 THEN substring(convert(varchar(8),js.last_run_date),1,4) +'-'+ substring(convert(varchar(8),js.last_run_date),5,2) +'-'+ substring(convert(varchar(8),js.last_run_date),7,2) +' '+
CASE len(js.last_run_time)
WHEN 6 THEN substring(convert(varchar(8),js.last_run_time),1,2) +':'+ substring(convert(varchar(8),js.last_run_time),3,2) +':'+ substring(convert(varchar(8),js.last_run_time),5,2)
WHEN 5 THEN +'0'+ substring(convert(varchar(8),js.last_run_time),1,1) +':'+ substring(convert(varchar(8),js.last_run_time),2,2) +':'+ substring(convert(varchar(8),js.last_run_time),4,2)
WHEN 4 THEN +'00:'+ substring(convert(varchar(8),js.last_run_time),1,2) +':'+ substring(convert(varchar(8),js.last_run_time),3,2)
WHEN 3 THEN +'00:0'+ substring(convert(varchar(8),js.last_run_time),1,1) +':'+ substring(convert(varchar(8),js.last_run_time),2,2)
WHEN 2 THEN +'00:00:'+ substring(convert(varchar(8),js.last_run_time),1,2)
WHEN 1 THEN +'00:00:0'+ substring(convert(varchar(8),js.last_run_time),1,1)
END
ELSE 'Never Executed'
END
,[Next_Run_Time] = CASE
WHEN ja.next_scheduled_run_date > 0 THEN convert(varchar(19),ja.next_scheduled_run_date,121)
ELSE 'Not Scheduled'
END
,[Description] = j.description
,[Drop_Statement] = 'sp_delete_job @job_name = ' + '''' + j.name + ''''
FROM sysjobs j
INNER JOIN sysjobservers js on j.job_id = js.job_id
INNER JOIN sysjobactivity ja on j.job_id = ja.job_id
INNER JOIN sys.server_principals sp on j.owner_sid = sp.sid
WHERE ja.session_id = (SELECT MAX(session_id) from msdb.dbo.sysjobactivity)
)as ttable
ORDER BY [Last_Run_Time]
Consultor Senior SQL Server & BI con 9 años de experiencia, MCSE Data Platform con conocimientos de toda la herramienta y enfocado principalmente a la detección y mejora de problemas de rendimiento en Base de Datos. En mi tiempo libre soy un gran aficionado a la fotografía de estilo urbano y de lugares abandonados.