Jawaban:
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 msdb
tabel.
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
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
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
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