Co to jest ERROR_STATE () w SQL Server i jak można go używać?


13

Przeczytałem, że ERROR_STATE()może to pomóc w rozróżnieniu różnych stanów / lokalizacji w kodzie źródłowym, w których może wystąpić ten sam typ błędu. Ale nie jest dla mnie jasne, jak to może być przydatne.

MSDN stwierdza:

ERROR_STATE() Zwraca numer stanu błędu, który spowodował uruchomienie bloku CATCH konstrukcji TRY… CATCH.

Jak można go naprawdę wykorzystać? Czy ktoś może mi podać przykład, podane w tym artykule referencyjnym nie pomagają mi dobrze wyjaśnić rzeczy?


Error_Statea Error_Numberkombinacja daje wyraźniejszy obraz błędu. Zobacz inne funkcje związane z obsługą błędów tutaj
Ravindra Gullapalli

Dzięki! Ale przeczytałem również ten link wcześniej. To nie pomogło, ponieważ nie podano dobrych przykładów tego na MSDN. Dlatego tutaj zadałem pytanie.

Odpowiedzi:


9

Celem stanów błędów programu SQL Server jest umożliwienie zespołowi programistycznemu SQL Server zidentyfikowania dokładnego miejsca, w którym zgłoszono błędy systemowe, biorąc pod uwagę, że wiele błędów jest zgłaszanych w wielu miejscach.

Jako użytkownik końcowy (tj. Programista aplikacji korzystających z programu SQL Server) możesz podobnie wykorzystać przekazany stan RAISERROR, aby dział wsparcia produktu mógł zidentyfikować miejsce, w którym procedura wywołuje błąd, na przykład:

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

Zobacz, jak oba te stany pozwalają później rozróżnić, który przypadek błędu został trafiony. Zanim powiesz „ale mogę spojrzeć na komunikat o błędzie”, mówię ci jedno słowo: internacjonalizacja.


Tak, tego szukałem ...! :) wszystko jasne już teraz! Dziękuję Ci!
jaczjill

bardzo ładna odpowiedź. wiedza uzyskana z twojego postu jest lepsza niż ta technet.microsoft.com/en-us/library/ms180031.aspx
kashif

6

Nie, nie pomaga ci dowiedzieć się, gdzie wystąpił błąd. Oto szybki przykład. Jeśli spróbujesz podzielić przez 0, pojawi się komunikat o błędzie z wieloma szczegółami:

SELECT 1/0;

Wynik:

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

Widzisz ten o nazwie State1? ERROR_STATE()zwraca tę wartość. Więc jeśli użyjesz TRY/CATCH:

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

Wynik:

----
   1

To wszystko. Nieprzydatne w większości scenariuszy. Sugeruję więcej lektur na temat obsługi błędów w ogóle, zanim zanurkujesz zbyt głęboko w konkretne funkcje, które wydają się przydatne.

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

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


Dzięki, to trochę pomogło. nie mogłem zagłosować na twoją odpowiedź, ponieważ nie mam wymaganych uprawnień. Chciałem jednak uzyskać powód istnienia tej funkcji na jej przykładzie. MSDN mówi, że ERROR_STATE () zwraca numer stanu błędu, więc co mam z tym zrobić !!

2
@ jaczjill czasami będziesz chciał, aby Twoja aplikacja reagowała w określony sposób w zależności od stanu błędu i złożoności architektury obsługi błędów, ale podejrzewam, że obsługa błędów zasadniczo tak się zdarza. Znacznie bardziej powszechny w przypadku samego numeru błędu (zatrzymywanie określonych błędów) lub wagi błędu. Nie przypominam sobie, aby ktokolwiek kiedykolwiek używał stanu błędu w znaczący sposób, z wyjątkiem pokazów pokazujących, że on istnieje.
Aaron Bertrand

ok, dzięki Aaron :) Czy mógłbyś ustalić nagrodę za to pytanie? aby niektórzy technicy podjęli wyzwanie, aby uzyskać DOKŁADNĄ odpowiedź. W przeciwnym razie jesteś zwycięzcą.

4
Tak @AaronBertrand wystawił kilka własnych punktów, aby konkurować z prawidłową odpowiedzią.
Zane

2
@jaczjill Niewiele jest techników, którzy wiedzą więcej o SQL Server niż Aaron i większość z nich nigdy się tu nie pojawia. Odpowiedź na twoje pytanie jest tutaj (najprawdopodobniej tak dokładnie, jak to możliwe).
dezso

1

Krótka odpowiedź - nie może. ERROR_STATE jest w zasadzie poddziałem ERROR_NUMBER. Nie może powiedzieć, który wiersz kodu spowodował błąd (z wyjątkiem sytuacji, gdy ERROR_NUMBER i ERROR_STATE razem podają przyczynę błędu, a następnie staje się oczywiste, jaka jest przyczyna).


Rozumiał koncepcyjnie, że należy go zawsze używać z funkcją ERROR_NUMBER (). Jednak przykład użycia ERROR_STATE () z ERROR_NUMBER () całkowicie wyjaśni obraz. LUB wystarczy dowolny dobry link referencyjny.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.