แบบสอบถามที่จะแสดงงาน sql ที่ล้มเหลวคืออะไรเพื่อที่ฉันจะได้รับข้อมูลงานที่ล้มเหลวทั้งหมดด้วยคำสั่งเดียว
แบบสอบถามที่จะแสดงงาน sql ที่ล้มเหลวคืออะไรเพื่อที่ฉันจะได้รับข้อมูลงานที่ล้มเหลวทั้งหมดด้วยคำสั่งเดียว
คำตอบ:
ฉันไม่คิดว่าคุณจะได้รับข้อมูล "งาน" ทั้งหมดในคิวรีเดียวเนื่องจากสามารถกำหนดค่างานให้ไปที่ไฟล์เอาต์พุตได้ บางครั้งไฟล์ที่ส่งออกอาจได้รับข้อมูลมากกว่าที่รายงานหรือเขียนลงในmsdb
ตาราง
อย่างไรก็ตามมุมมองที่พบโดยการดูประวัติงานผ่าน SSMS สามารถดึงมาพร้อมกับแบบสอบถามนี้เพื่อส่งคืนงานที่ล้มเหลวเท่านั้น (เช่นหากงานมี 2 ขั้นตอนและงานที่สองล้มเหลวแบบสอบถามนี้จะส่งคืนทั้งสองขั้นตอน):
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
คุณสามารถรับข้อมูลนี้ได้จากรายงานมาตรฐานที่มีอยู่ในเซิร์ฟเวอร์ sql:
คลิกขวาที่ตัวแทนเซิร์ฟเวอร์ SQL> รายงานมาตรฐานและเลือกรายงานที่ต้องการเช่นการเรียกใช้งาน "ล้มเหลวหรือรายการที่ใช้เวลานาน" .. เลือกรายงานตามที่คุณต้องการ:
หรือ,
คุณสามารถใช้สคริปต์ด้านล่างเพื่อค้นหางานที่ล้มเหลวใน 24 ชั่วโมงที่ผ่านมา:
-- 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
และหากคุณต้องการข้อมูลตามรายงานให้ใช้รหัสในลิงค์นี้
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
ฉันแก้ไขรหัสของ Shawn Melton เล็กน้อยเพื่อรับข้อผิดพลาดงานทั้งหมดใน 24 ชั่วโมงที่ผ่านมา มีคำสั่งที่ขาดหายไปในการเข้าร่วมฉันแก้ไขเช่นกัน ขอบคุณมาก Shawn สิ่งดีๆ!
/* 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