Was ist die Abfrage, um die fehlgeschlagenen SQL-Jobs anzuzeigen

Antworten:

12

Ich glaube nicht, dass Sie mit einer Abfrage wirklich "alle" Jobinformationen erhalten, da Jobs so konfiguriert werden können, dass sie Ausgabedateien enthalten. Ausgabedateien können manchmal mehr Informationen erhalten, als gemeldet oder in die msdbTabellen geschrieben werden.

Mit dieser Abfrage kann jedoch die Ansicht abgerufen werden, die beim Anzeigen des Auftragsverlaufs über SSMS gefunden wird, um nur fehlgeschlagene Aufträge zurückzugeben.

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

Bildbeschreibung hier eingeben

Laurenz Albe
quelle
6

Sie können diese Informationen über die in SQL Server verfügbaren Standardberichte abrufen:

Klicken Sie mit der rechten Maustaste auf SQL Server-Agent> Standardberichte und wählen Sie den gewünschten Bericht aus, z. B. "Fehlgeschlagene oder sehr zeitaufwendige". Wählen Sie den Bericht nach Bedarf aus:

Oder,

Sie können das folgende Skript verwenden, um Aufträge zu finden, die in den letzten 24 Stunden fehlgeschlagen sind:

-- 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  

Und wenn Sie die Informationen als Bericht benötigen, verwenden Sie den Code in diesem Link

KASQLDBA
quelle
Danke für den Tipp, genau das habe ich gesucht. Ich denke, wir könnten die Variablen ein wenig vereinfachen, um die gleichen Ergebnisse zu 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

Ich habe Shawn Meltons Code leicht modifiziert, um alle Jobfehler in den letzten 24 Stunden zu erhalten. Es fehlte eine Anweisung im Join, das habe ich auch behoben. Vielen Dank Shawn, tolles Zeug!


/*  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
Ryan Bradley
quelle