ERROR_STATE () ใน SQL Server คืออะไรและสามารถใช้งานได้อย่างไร?


13

ฉันอ่านว่าERROR_STATE()สามารถช่วยแยกแยะความแตกต่างระหว่างสถานะ / สถานที่ต่าง ๆ ในซอร์สโค้ดซึ่งเกิดข้อผิดพลาดประเภทเดียวกันได้ แต่มันไม่ชัดเจนสำหรับฉันว่ามันมีประโยชน์อย่างไร

สถานะ MSDN:

ERROR_STATE() ส่งคืนหมายเลขสถานะของข้อผิดพลาดที่ทำให้บล็อก CATCH ของโครงสร้าง TRY … CATCH ถูกเรียกใช้

สามารถนำไปใช้งานจริงได้อย่างไร? บางคนสามารถยกตัวอย่างให้ฉันคนที่ให้ไว้ในบทความอ้างอิงนี้ไม่ได้ช่วยอธิบายสิ่งต่าง ๆ ได้ดีสำหรับฉัน


Error_StateและการError_Numberรวมกันจะช่วยให้คุณเห็นภาพที่ชัดเจนยิ่งขึ้นเกี่ยวกับข้อผิดพลาด ดูข้อผิดพลาดอื่น ๆ ที่เกี่ยวข้องกับฟังก์ชั่นการจัดการที่นี่
Ravindra Gullapalli

ขอบคุณ! แต่ฉันได้อ่านลิงค์นี้ก่อนหน้านี้เช่นกัน มันไม่ได้ช่วยอะไรเพราะมีตัวอย่างที่ดีสำหรับ MSDN นั่นเป็นเหตุผลที่ฉันถามคำถามที่นี่

คำตอบ:


9

วัตถุประสงค์ของการระบุสถานะข้อผิดพลาด SQL Server สำหรับทีมพัฒนา SQL Server เพื่อให้สามารถระบุรหัสข้อผิดพลาดของระบบสถานที่ที่ถูกยกขึ้นเนื่องจากข้อผิดพลาดจำนวนมากถูกยกขึ้นในหลายสถานที่

คุณในฐานะผู้ใช้ปลายทาง (เช่นผู้พัฒนาแอปพลิเคชันที่ใช้ SQL Server) สามารถใช้สถานะที่ส่งผ่านเพื่อRAISERRORให้ฝ่ายสนับสนุนผลิตภัณฑ์ของคุณสามารถระบุสถานที่ที่โพรซีเดอร์ก่อให้เกิดข้อผิดพลาดได้เช่น:

create procedure usp_my_proc
as
if <somecondition>
  raiserror(N'Error foo and bar', 16, 0);
if <someothercondition>
  raiserror(N'Error foo and bar', 16, 1);
go

ดูว่าสถานะสองสถานะช่วยให้คุณสามารถแยกแยะความแตกต่างได้ในภายหลังว่าเกิดข้อผิดพลาดอะไร ก่อนที่คุณจะพูดว่า 'แต่ฉันสามารถดูข้อความแสดงข้อผิดพลาด' ฉันกำลังบอกคุณหนึ่งคำ: ความเป็นสากล


ใช่นี่คือสิ่งที่ฉันกำลังมองหา .. ! :) ชัดเจนตอนนี้! ขอขอบคุณ!
jaczjill

คำตอบที่ดีมาก ความรู้ที่ได้รับจากโพสต์ของคุณนั้นมีความเข้าใจที่ดีขึ้นดังนั้นtechnet.microsoft.com/en-us/library/ms180031.aspx
kashif

6

ไม่มันไม่ได้ช่วยให้คุณค้นหาข้อมูลเกี่ยวกับข้อผิดพลาดที่เกิดขึ้น นี่คือตัวอย่างด่วน หากคุณพยายามหารด้วย 0 คุณจะได้รับข้อความแสดงข้อผิดพลาดพร้อมรายละเอียดมากมาย:

SELECT 1/0;

ผลลัพธ์:

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.

ดูหนึ่งที่เรียกว่าStateมีค่า 1? ERROR_STATE()ส่งคืนค่านี้ ดังนั้นถ้าคุณใช้TRY/CATCH:

BEGIN TRY
  SELECT 1/0;
END TRY
BEGIN CATCH
  SELECT ERROR_STATE();
END CATCH

ผลลัพธ์:

----
   1

นั่นคือทั้งหมดที่ ไม่มีประโยชน์ในสถานการณ์ส่วนใหญ่ ฉันขอแนะนำให้อ่านเพิ่มเติมเกี่ยวกับการจัดการข้อผิดพลาดโดยทั่วไปก่อนที่คุณจะดำลึกลงไปในฟังก์ชั่นเฉพาะที่ให้เสียงที่มีประโยชน์

http://msdn.microsoft.com/en-us/library/ms175976.aspx

http://www.sommarskog.se/error_handling_2005.html


ขอบคุณมันช่วยได้นิดหน่อย ไม่สามารถโหวตคำตอบของคุณได้เนื่องจากฉันไม่ได้รับสิทธิ์ อย่างไรก็ตามฉันต้องการได้รับเหตุผลของการมีอยู่ของฟังก์ชันนี้ด้วยตัวอย่างของมัน MSDN พูดว่า ERROR_STATE () คืนค่าหมายเลขสถานะข้อผิดพลาดจากนั้นฉันจะทำอย่างไรกับสิ่งนั้น !!

2
@jaczjill บางครั้งคุณจะต้องการให้แอปพลิเคชันของคุณตอบกลับไปทางใดทางหนึ่งขึ้นอยู่กับ error_state และความซับซ้อนของสถาปัตยกรรมการจัดการข้อผิดพลาดของคุณ แต่ฉันสงสัยว่าการจัดการข้อผิดพลาดแบบกว้าง ๆ พบได้ทั่วไปมากขึ้นด้วยหมายเลขข้อผิดพลาด (การดักจับข้อผิดพลาดเฉพาะ ) หรือความรุนแรงของข้อผิดพลาด ฉันจำไม่ได้ว่าเคยเห็นใครใช้สถานะข้อผิดพลาดอย่างมีความหมายยกเว้นในการสาธิตที่แสดงว่ามีอยู่จริง
Aaron Bertrand

เอาล่ะขอบคุณ Aaron :) นอกจากนี้คุณช่วยกำหนดความโปรดปรานสำหรับคำถามนี้ได้ไหม เพื่อให้นักเทคนิคบางคนใช้เวลาเป็นสิ่งที่ท้าทายเพื่อให้ได้คำตอบที่แน่นอน มิฉะนั้นคุณจะเป็นผู้ชนะ

4
Yeah @AaronBertrand รวบรวมคะแนนของคุณเองเพื่อแข่งขันกับคำตอบที่ถูกต้องของคุณ
Zane

2
@jaczjill มีเทคโนโลยีไม่มากที่รู้เพิ่มเติมเกี่ยวกับ SQL Server มากกว่า Aaron และส่วนใหญ่ไม่เคยปรากฏที่นี่ และคำถามของคุณจะได้รับคำตอบที่นี่ (อาจเป็นไปได้มากที่สุด)
dezso

1

คำตอบสั้น ๆ - มันไม่สามารถ ข้อผิดพลาดนั้นเป็นส่วนย่อยของ ERROR_NUMBER ไม่สามารถบอกคุณได้ว่าบรรทัดของรหัสใดที่ทำให้เกิดข้อผิดพลาด (ยกเว้นตราบเท่าที่ ERROR_NUMBER และ ERROR_STATE ร่วมกันบอกสาเหตุของข้อผิดพลาดและจากนั้นจะเห็นได้ชัดว่าสาเหตุคืออะไร)


เข้าใจแนวคิดว่าจะต้องใช้กับฟังก์ชัน ERROR_NUMBER () เสมอ อย่างไรก็ตามตัวอย่างของการใช้งาน ERROR_STATE () กับ ERROR_NUMBER () จะทำให้ภาพชัดเจนขึ้น หรือลิงค์อ้างอิงที่ดีจะเพียงพอ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.