Quelle est la requête pour afficher les travaux SQL ayant échoué


Réponses:


12

Je ne pense pas que vous obtiendrez vraiment "toutes" les informations sur le travail avec une seule requête, car les travaux peuvent être configurés pour aller aux fichiers de sortie. Les fichiers de sortie peuvent parfois obtenir plus d'informations que ce qui est rapporté ou écrit dans les msdbtables.

Cependant, la vue trouvée en consultant l'historique des travaux via SSMS peut être extraite de cette requête pour renvoyer uniquement les travaux ayant échoué (par exemple, si un travail comporte 2 étapes et que la seconde a échoué, cette requête renverra les deux étapes):

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

entrez la description de l'image ici


6

Vous pouvez obtenir ces informations par les rapports standard disponibles dans le serveur SQL:

Faites un clic droit sur l'agent serveur SQL> Rapports standard et sélectionnez le rapport souhaité comme les exécutions de travaux "celles qui ont échoué ou celles qui prennent beaucoup de temps" .. Sélectionnez le rapport selon vos besoins:

Ou,

Vous pouvez utiliser le script ci-dessous pour rechercher les travaux qui ont échoué au cours des dernières 24 heures:

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

Et si vous avez besoin des informations en tant que rapport, utilisez le code de ce lien


Merci pour l'astuce, c'est exactement ce que je cherchais. Je pense que nous pourrions simplifier un peu les variables pour obtenir les mêmes résultats: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

J'ai légèrement modifié le code de Shawn Melton pour obtenir toutes les erreurs de travail au cours des dernières 24 heures. Il manquait une déclaration dans la jointure, je l'ai également corrigée. Merci beaucoup Shawn, super truc!


/*  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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.