Câu trả lời:
Tôi không nghĩ rằng bạn thực sự sẽ nhận được "tất cả" thông tin công việc với một truy vấn vì các công việc có thể được cấu hình để chuyển đến các tệp đầu ra. Các tệp đầu ra đôi khi có thể nhận được nhiều thông tin hơn được báo cáo hoặc ghi vào msdb
bảng.
Tuy nhiên, chế độ xem được tìm thấy bằng cách xem lịch sử công việc qua SSMS có thể được kéo bằng truy vấn này để chỉ trả về các công việc không thành công (ví dụ: nếu một công việc có 2 bước và lần thứ hai thất bại thì truy vấn này sẽ trả về cả hai bước):
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
Bạn có thể nhận thông tin này bằng các báo cáo tiêu chuẩn có sẵn trong máy chủ sql:
Nhấp chuột phải vào tác nhân máy chủ SQL> Báo cáo chuẩn và chọn báo cáo mong muốn như thực thi công việc "thất bại hoặc mất nhiều thời gian" .. Chọn báo cáo theo yêu cầu của bạn:
Hoặc là,
Bạn có thể sử dụng tập lệnh bên dưới để tìm việc thất bại trong 24 giờ qua:
-- 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
Và nếu bạn cần thông tin như một báo cáo, hãy sử dụng mã trong liên kết này
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
Tôi đã sửa đổi mã của Shawn Melton một chút để nhận tất cả các lỗi công việc trong 24 giờ qua. Có một tuyên bố bị thiếu trong tham gia, tôi cũng đã sửa nó. Cảm ơn nhiều Shawn, công cụ tuyệt vời!
/* 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