Apa Permintaan untuk menampilkan pekerjaan sql yang gagal

Jawaban:

12

Saya tidak berpikir Anda akan benar-benar mendapatkan "semua" informasi pekerjaan dengan satu permintaan karena pekerjaan dapat dikonfigurasi untuk pergi ke file output. File output kadang-kadang bisa mendapatkan informasi lebih banyak daripada yang dilaporkan atau ditulis ke msdbtabel.

Namun, tampilan yang ditemukan dengan melihat riwayat pekerjaan melalui SSMS dapat ditarik dengan kueri ini untuk mengembalikan hanya pekerjaan yang gagal (mis. Jika suatu pekerjaan memiliki 2 langkah dan yang kedua gagal kueri ini akan mengembalikan kedua langkah):

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

masukkan deskripsi gambar di sini

Laurenz Albe
sumber
6

Anda bisa mendapatkan informasi ini dengan laporan standar yang tersedia di server sql:

Buat klik kanan pada agen SQL server> Laporan standar dan pilih laporan yang diinginkan seperti eksekusi pekerjaan "yang gagal atau yang menghabiskan banyak waktu" ..Pilih laporan sesuai yang Anda butuhkan:

Atau,

Anda dapat menggunakan skrip di bawah ini untuk menemukan pekerjaan yang gagal dalam 24 jam terakhir:

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

Dan jika Anda membutuhkan informasi sebagai laporan, gunakan kode di tautan ini

KASQLDBA
sumber
Terima kasih atas tipnya, inilah tepatnya yang saya cari. Saya pikir kita bisa menyederhanakan variabel sedikit untuk mendapatkan hasil yang sama: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

Saya memodifikasi kode Shawn Melton sedikit untuk mendapatkan semua kesalahan pekerjaan dalam 24 jam terakhir. Ada pernyataan yang hilang di gabung, saya memperbaikinya juga. Terima kasih banyak, Shawn, hal-hal hebat!


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