ERROR_STATE () trong SQL Server là gì và làm thế nào để sử dụng nó?


13

Tôi đọc ERROR_STATE()có thể giúp phân biệt giữa các trạng thái / vị trí khác nhau trong mã nguồn nơi xảy ra cùng một loại lỗi. Nhưng nó không thực sự rõ ràng với tôi rằng làm thế nào nó có thể hữu ích.

MSDN tuyên bố:

ERROR_STATE() Trả về số trạng thái của lỗi khiến khối CATCH của cấu trúc TRY CAT CATCH được chạy.

Làm thế nào nó có thể thực sự được sử dụng? Ai đó có thể cho tôi một ví dụ, những người được cung cấp trong bài viết tham khảo này không thực sự giúp giải thích những điều tốt cho tôi?


Error_StateError_Numbersự kết hợp sẽ cho bạn hình ảnh rõ ràng hơn về một lỗi. Có một cái nhìn khác về các chức năng liên quan đến xử lý lỗi ở đây
Ravindra Gullapalli

Cảm ơn! Nhưng tôi đã đọc liên kết này sớm hơn. Nó không giúp được gì vì những ví dụ không hay được đưa ra cho điều này trên MSDN. Đó là lý do tại sao tôi nêu câu hỏi ở đây.

Câu trả lời:


9

Mục đích của các trạng thái lỗi của SQL Server là để nhóm phát triển SQL Server có thể xác định trong mã các lỗi hệ thống chính xác được đưa ra, do có nhiều lỗi được đưa ra ở nhiều nơi.

Bạn với tư cách là người dùng cuối (ví dụ: nhà phát triển ứng dụng sử dụng SQL Server) có thể sử dụng tương tự trạng thái được truyền vào để bộ RAISERRORphận hỗ trợ sản phẩm của bạn có thể xác định vị trí mà thủ tục gây ra lỗi, ví dụ:

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

Xem cách hai trạng thái cho phép bạn phân biệt trường hợp lỗi nào được nhấn. Trước khi bạn nói 'nhưng tôi có thể nhìn vào thông báo lỗi' Tôi đang nói với bạn một từ: quốc tế hóa.


Vâng, đây là những gì tôi đang tìm kiếm ..! :) tất cả rõ ràng ngay bây giờ! Cảm ơn bạn!
jaczjill

câu trả lời rất hay những kiến thức thu được từ bài viết của bạn là hiểu tốt hơn thì đây technet.microsoft.com/en-us/library/ms180031.aspx
Kashif

6

Không, nó không giúp bạn tìm ra bất cứ điều gì về nơi xảy ra lỗi. Dưới đây là một ví dụ nhanh. Nếu bạn cố chia cho 0, bạn sẽ nhận được thông báo lỗi với một loạt các chi tiết:

SELECT 1/0;

Kết quả:

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

Xem cái được gọi State , với giá trị là 1? ERROR_STATE()trả về giá trị này Vì vậy, nếu bạn sử dụng TRY/CATCH:

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

Kết quả:

----
   1

Đó là tất cả. Không hữu ích trong hầu hết các kịch bản. Tôi đề nghị đọc thêm về xử lý lỗi nói chung trước khi bạn đi sâu vào các chức năng cụ thể nghe có vẻ hữu ích.

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

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


Cảm ơn, nó đã giúp một chút. không thể bỏ phiếu cho câu trả lời của bạn vì tôi không có đặc quyền cần thiết. Tuy nhiên, tôi muốn lấy lý do tồn tại của hàm này với ví dụ của nó. MSDN cho biết ERROR_STATE () trả về số trạng thái lỗi, sau đó tôi phải làm gì với điều đó !!

2
@jaczjill đôi khi bạn sẽ muốn ứng dụng của mình phản hồi theo một cách nhất định tùy thuộc vào error_state và mức độ phức tạp của kiến ​​trúc xử lý lỗi của bạn, nhưng tôi nghi ngờ việc xử lý lỗi rộng rãi như thế là rất hiếm. Phổ biến hơn nhiều với chính số lỗi (bẫy các lỗi cụ thể ) hoặc mức độ nghiêm trọng của lỗi. Tôi không nhớ là đã từng thấy ai sử dụng trạng thái lỗi theo cách có ý nghĩa ngoại trừ trong các bản demo cho thấy nó tồn tại.
Aaron Bertrand

được rồi, cảm ơn Aaron :) Ngoài ra, bạn có thể đặt tiền thưởng cho câu hỏi này không? để một số tín đồ công nghệ chấp nhận câu trả lời CHÍNH XÁC của nó. Khác bạn là người đàn ông chiến thắng.

4
Vâng @AaronBertrand đưa ra một loạt các điểm của riêng bạn để cạnh tranh với câu trả lời đúng của bạn.
Zane

2
@jaczjill Không có nhiều kỹ thuật viên biết nhiều về SQL Server hơn Aaron và hầu hết trong số họ không bao giờ xuất hiện ở đây. Và câu hỏi của bạn được trả lời ở đây (rất có thể chính xác như nó có thể đi).
dezso

1

Câu trả lời ngắn gọn - không thể. ERROR_STATE về cơ bản là một bộ phận phụ của ERROR_NUMBER. Nó không thể cho bạn biết dòng mã nào gây ra lỗi (ngoại trừ trong trường hợp ERROR_NUMBER và ERROR_STATE cùng nhau cho bạn biết nguyên nhân gây ra lỗi và sau đó rõ ràng nguyên nhân là gì).


Hiểu theo khái niệm rằng nó sẽ được sử dụng với hàm ERROR_NUMBER (). Tuy nhiên, một ví dụ về việc sử dụng ERROR_STATE () với ERROR_NUMBER () sẽ làm rõ hình ảnh hoàn toàn. HOẶC bất kỳ liên kết tham khảo tốt sẽ là đủ.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.