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?

jaczjill
źródło
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.

Remus Rusanu
źródło
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

Aaron Bertrand
źródło
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).

RB.
źródło
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.