¿Cuál es la consulta para mostrar los trabajos SQL fallidos?


Respuestas:


12

No creo que realmente obtenga "toda" la información del trabajo con una sola consulta, ya que los trabajos se pueden configurar para ir a los archivos de salida. Los archivos de salida a veces pueden obtener más información de la que se informa o se escribe en elmsdb tablas.

Sin embargo, la vista que se encuentra al mirar el historial de trabajos a través de SSMS se puede extraer con esta consulta para devolver solo trabajos fallidos (por ejemplo, si un trabajo tiene 2 pasos y el segundo falló, esta consulta devolverá ambos pasos):

select j.name
    ,js.step_name
    ,jh.sql_severity
    ,jh.message
    ,jh.run_date
    ,jh.run_time
FROM msdb.dbo.sysjobs AS j
INNER JOIN msdb.dbo.sysjobsteps AS js
   ON js.job_id = j.job_id
INNER JOIN msdb.dbo.sysjobhistory AS jh
   ON jh.job_id = j.job_id AND jh.step_id = js.step_id
WHERE jh.run_status = 0

ingrese la descripción de la imagen aquí


6

Puede obtener esta información mediante los informes estándar disponibles en el servidor SQL:

Haga clic con el botón derecho en Agente de servidor SQL> Informes estándar y seleccione el informe deseado, como ejecuciones de trabajo "fallidas o que toman mucho tiempo". Seleccione el informe según sea necesario:

O,

Puede usar el siguiente script para encontrar trabajos fallidos en las últimas 24 horas:

-- Variable Declarations 

DECLARE @PreviousDate datetime  
DECLARE @Year VARCHAR(4)   
DECLARE @Month VARCHAR(2)  
DECLARE @MonthPre VARCHAR(2)  
DECLARE @Day VARCHAR(2)  
DECLARE @DayPre VARCHAR(2)  
DECLARE @FinalDate INT  

-- Initialize Variables  
SET @PreviousDate = DATEADD(dd, -1, GETDATE()) -- Last 1 day   
SET @Year = DATEPART(yyyy, @PreviousDate)   
SELECT @MonthPre = CONVERT(VARCHAR(2), DATEPART(mm, @PreviousDate))  
SELECT @Month = RIGHT(CONVERT(VARCHAR, (@MonthPre + 1000000000)),2)  
SELECT @DayPre = CONVERT(VARCHAR(2), DATEPART(dd, @PreviousDate))  
SELECT @Day = RIGHT(CONVERT(VARCHAR, (@DayPre + 1000000000)),2)  
SET @FinalDate = CAST(@Year + @Month + @Day AS INT)  

-- Final Logic 

SELECT   j.[name],  
         s.step_name,  
         h.step_id,  
         h.step_name,  
         h.run_date,  
         h.run_time,  
         h.sql_severity,  
         h.message,   
         h.server  
FROM     msdb.dbo.sysjobhistory h  
         INNER JOIN msdb.dbo.sysjobs j  
           ON h.job_id = j.job_id  
         INNER JOIN msdb.dbo.sysjobsteps s  
           ON j.job_id = s.job_id 
           AND h.step_id = s.step_id  
WHERE    h.run_status = 0 -- Failure  
         AND h.run_date > @FinalDate  
ORDER BY h.instance_id DESC  

Y si necesita la información como un informe, use el código en este enlace


Gracias por el consejo, esto es exactamente lo que estaba buscando. Creo que podríamos simplificar un poco las variables para obtener los mismos resultados:DECLARE @FinalDate INT; -- Initialize Variables SET @FinalDate = CAST(CONVERT(VARCHAR(10), DATEADD(dd, -1, GETDATE()), 112) AS INT) -- Yesterday's date as Integer in YYYYMMDD format -- Final Logic .... no change

1

Modifiqué ligeramente el código de Shawn Melton para obtener todos los errores de trabajo en las últimas 24 horas. Faltaba una declaración en la unión, lo arreglé también. Muchas gracias Shawn, ¡cosas geniales!


/*  Select all jobs with an error in the past 24 hours */
SELECT MSDB.dbo.agent_datetime(jh.run_date,jh.run_time) as date_time
    ,j.name as job_name,js.step_id as job_step,jh.message as error_message
    FROM msdb.dbo.sysjobs AS j
    INNER JOIN msdb.dbo.sysjobsteps AS js ON js.job_id = j.job_id
    INNER JOIN msdb.dbo.sysjobhistory AS jh ON jh.job_id = j.job_id AND jh.step_id = js.step_id
    WHERE jh.run_status = 0 AND MSDB.dbo.agent_datetime(jh.run_date,jh.run_time) >= GETDATE()-1
    ORDER BY MSDB.dbo.agent_datetime(jh.run_date,jh.run_time) DESC
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.