Was ist ERROR_STATE () in SQL Server und wie kann es verwendet werden?


13

Ich habe gelesen, dass ERROR_STATE()dies helfen kann, zwischen verschiedenen Zuständen / Orten im Quellcode zu unterscheiden, an denen der gleiche Fehlertyp auftreten kann. Aber mir ist nicht wirklich klar, wie nützlich es sein kann.

MSDN gibt an:

ERROR_STATE() Gibt die Statusnummer des Fehlers zurück, der zur Ausführung des CATCH-Blocks eines TRY… CATCH-Konstrukts geführt hat.

Wie kann es wirklich genutzt werden? Kann mir jemand ein Beispiel geben, die in diesem Referenzartikel nicht wirklich helfen, die Dinge für mich gut zu erklären?


Error_StateDurch die Error_NumberKombination erhalten Sie ein klareres Bild über einen Fehler.
Werfen

Vielen Dank! Aber ich hatte diesen Link auch schon früher gelesen. Es hat nicht geholfen, da auf MSDN keine guten Beispiele dafür angegeben sind. Deshalb habe ich hier eine Frage gestellt.

Antworten:


9

Der Zweck von SQL Server-Fehlerzuständen besteht darin, dass das SQL Server-Entwicklungsteam im Code die genaue Stelle identifizieren kann, an der Systemfehler aufgetreten sind, da viele Fehler an mehreren Stellen auftreten.

Sie als Endbenutzer (dh Entwickler von Anwendungen, die SQL Server verwenden) können den übergebenen Status auf ähnliche Weise verwenden, RAISERRORdamit Ihr Produkt-Support den Ort identifizieren kann, an dem eine Prozedur einen Fehler auslöst, z. B.:

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

Sehen Sie, wie Sie mit den beiden Status später unterscheiden können, welcher Fehlerfall aufgetreten ist. Bevor Sie sagen "aber ich kann mir die Fehlermeldung ansehen", sage ich Ihnen ein Wort: Internationalisierung.


Ja, das habe ich gesucht ..! :) alles klar jetzt! Vielen Dank!
Jaczjill

sehr schöne Antwort. Das Wissen, das Sie aus Ihrem Beitrag erhalten haben, ist besser zu verstehen als dieses technet.microsoft.com/en-us/library/ms180031.aspx
kashif

6

Nein, es hilft Ihnen nicht herauszufinden, wo der Fehler aufgetreten ist. Hier ist ein kurzes Beispiel. Wenn Sie versuchen, durch 0 zu teilen, erhalten Sie eine Fehlermeldung mit einer Reihe von Details:

SELECT 1/0;

Ergebnis:

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

Sehen Sie die aufgerufene Statemit einem Wert von 1? ERROR_STATE()gibt diesen Wert zurück. Also, wenn Sie verwenden TRY/CATCH:

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

Ergebnis:

----
   1

Das ist alles. In den meisten Szenarien nicht nützlich. Ich empfehle, mehr über die Fehlerbehandlung im Allgemeinen zu lesen, bevor Sie zu tief in bestimmte Funktionen eintauchen, die nützlich klingen.

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

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


Danke, es hat ein bisschen geholfen. Ich konnte Ihre Antwort nicht abstimmen, da ich kein Privileg benötigt habe. Ich wollte jedoch den Grund für die Existenz dieser Funktion anhand ihres Beispiels ermitteln. MSDN sagt, dass ERROR_STATE () die Fehlerstatusnummer zurückgibt. Was mache ich dann damit !!

2
@jaczjill Manchmal möchten Sie, dass Ihre Anwendung abhängig vom error_state und der Komplexität Ihrer Fehlerbehandlungsarchitektur auf eine bestimmte Weise reagiert, aber ich vermute, dass die Behandlung von Fehlern im Großen und Ganzen selten ist. Viel häufiger mit der Fehlernummer selbst (Einfangen bestimmter Fehler) oder der Fehlerschwere. Ich kann mich nicht erinnern, jemals jemanden gesehen zu haben, der den Fehlerstatus auf sinnvolle Weise verwendet, außer in Demos, die zeigen, dass er existiert.
Aaron Bertrand

Okay, danke Aaron :) Könnten Sie auch ein Kopfgeld für diese Frage setzen? so dass es ein Technikfreak als Herausforderung aufnimmt, um seine GENAUE Antwort zu bekommen. Sonst bist du der Gewinner.

4
Ja, @AaronBertrand hat eine Reihe eigener Punkte gesammelt, um gegen Ihre richtige Antwort anzutreten.
Zane

2
@jaczjill Es gibt nicht so viele Technikfreaks, die mehr über SQL Server wissen als Aaron, und die meisten von ihnen tauchen hier nie auf. Und Ihre Frage wird hier beantwortet (höchstwahrscheinlich so genau wie es gehen könnte).
Dekso

1

Kurze Antwort - es kann nicht. Ein ERROR_STATE ist im Wesentlichen eine Unterteilung eines ERROR_NUMBER. Es kann Ihnen nicht sagen, welche Codezeile den Fehler verursacht hat (außer insofern, als ERROR_NUMBER und ERROR_STATE zusammen die Ursache des Fehlers angeben und dann die Ursache offensichtlich wird).


Konzeptionell verstanden, dass es immer mit der Funktion ERROR_NUMBER () verwendet werden soll. Ein Beispiel für die Verwendung von ERROR_STATE () mit ERROR_NUMBER () verdeutlicht das Bild jedoch vollständig. ODER ein guter Referenzlink reicht aus.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.