Qual è la query per visualizzare i lavori sql non riusciti


Risposte:


12

Non penso che otterrai davvero "tutte" le informazioni sul lavoro con una query poiché i lavori possono essere configurati per andare ai file di output. A volte i file di output possono ottenere più informazioni di quanto riportato o scritto nelle msdbtabelle.

Tuttavia, la vista che si trova guardando la cronologia dei lavori tramite SSMS può essere estratta con questa query per restituire solo lavori non riusciti (ad es. Se un lavoro ha 2 passaggi e il secondo errore questa query restituirà entrambi i passaggi):

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

inserisci qui la descrizione dell'immagine


6

È possibile ottenere queste informazioni dai report standard disponibili nel server SQL:

Fare clic con il tasto destro del mouse su Agente server SQL> Rapporti standard e selezionare il rapporto desiderato come esecuzioni lavoro "fallite o che richiedono molto tempo". Selezionare il rapporto secondo le proprie necessità:

O,

È possibile utilizzare lo script seguente per trovare lavori non riusciti nelle ultime 24 ore:

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

E se hai bisogno delle informazioni come rapporto usa il codice in questo link


Grazie per il suggerimento, questo è esattamente quello che stavo cercando. Penso che potremmo semplificare un po 'le variabili per ottenere gli stessi risultati: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

Ho modificato leggermente il codice di Shawn Melton per ottenere tutti gli errori di lavoro nelle ultime 24 ore. Mancava una dichiarazione nel join, ho risolto anche quello. Grazie mille Shawn, grandi cose!


/*  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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.