O que é a consulta para exibir os trabalhos sql com falha

Respostas:

12

Eu não acho que você realmente obterá "todas" as informações do trabalho com uma consulta, pois os trabalhos podem ser configurados para ir para os arquivos de saída. Os arquivos de saída às vezes podem obter mais informações do que as relatadas ou gravadas nas msdbtabelas.

No entanto, a exibição encontrada ao examinar o histórico do trabalho via SSMS pode ser puxada com esta consulta para retornar apenas trabalhos com falha (por exemplo, se um trabalho tiver 2 etapas e o segundo falhar, essa consulta retornará as duas etapas):

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

insira a descrição da imagem aqui

Laurenz Albe
fonte
6

Você pode obter essas informações pelos relatórios padrão disponíveis no servidor sql:

Clique com o botão direito do mouse em SQL server agent> Relatórios padrão e selecione o relatório desejado, como execuções de tarefas "com falha ou demoradas". Selecione o relatório conforme necessário:

Ou,

Você pode usar o script abaixo para encontrar trabalhos com falha nas ú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  

E se você precisar das informações como relatório, use o código neste link

KASQLDBA
fonte
Obrigado pela dica, é exatamente isso que eu estava procurando. Eu acho que poderíamos simplificar um pouco as variáveis ​​para obter os mesmos 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

Modifiquei levemente o código de Shawn Melton para obter todos os erros de trabalho nas últimas 24 horas. Havia uma declaração faltando na associação, eu também corrigi isso. Muito obrigado Shawn, ótimas coisas!


/*  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
fonte