it-swarm.com.de

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

Ich habe gelesen, dass ERROR_STATE() helfen kann, zwischen verschiedenen Zuständen/Stellen im Quellcode zu unterscheiden, an denen dieselbe Art von Fehler 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, das in dieser Referenzartikel angegeben ist, hilft mir nicht wirklich, die Dinge gut zu erklären?

13
jaczjill

Der Zweck von SQL Server-Fehlerzuständen besteht darin, dass das SQL Server-Entwicklungsteam im Code den genauen Ort identifizieren kann, an dem Systemfehler aufgetreten sind, da viele Fehler an mehreren Stellen auftreten.

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

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.

9
Remus Rusanu

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.

Siehe die mit dem Namen State mit dem Wert 1? ERROR_STATE() gibt diesen Wert zurück. Wenn Sie also TRY/CATCH Verwenden:

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

6
Aaron Bertrand

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).

1
RB.