Qu'est-ce que ERROR_STATE () dans SQL Server et comment peut-il être utilisé?

13

J'ai lu que cela ERROR_STATE()peut aider à distinguer les différents états / emplacements dans le code source où le même type d'erreur peut se produire. Mais il n'est pas vraiment clair pour moi que cela peut être utile.

MSDN déclare:

ERROR_STATE() Renvoie le numéro d'état de l'erreur qui a provoqué l'exécution du bloc CATCH d'une construction TRY… CATCH.

Comment peut-on vraiment l'utiliser? Quelqu'un peut-il me donner un exemple, ceux fournis dans cet article de référence ne m'aident pas vraiment à bien expliquer les choses?

jaczjill
la source
Error_Stateet la Error_Numbercombinaison vous donnera une image plus claire d'une erreur. Jetez un œil à d'autres fonctions liées à la gestion des erreurs ici
Ravindra Gullapalli
Merci! Mais j'avais également lu ce lien plus tôt. Cela n'a pas aidé car de bons exemples ne sont pas donnés pour cela sur MSDN. C'est pourquoi j'ai soulevé la question ici.

Réponses:

9

Le but des états d'erreur SQL Server est que l'équipe de développement SQL Server puisse identifier dans le code l'endroit exact où les erreurs système ont été déclenchées, étant donné que de nombreuses erreurs sont déclenchées à plusieurs endroits.

En tant qu'utilisateur final (c'est-à-dire développeur d'applications utilisant SQL Server), vous pouvez également utiliser l'état transmis RAISERRORafin que votre support produit puisse identifier l'endroit où une procédure génère une erreur, par exemple:

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

Voyez comment les deux états vous permettent de distinguer plus tard quel cas d'erreur a été atteint. Avant de dire «mais je peux regarder le message d'erreur», je vous dis un mot: l'internationalisation.

Remus Rusanu
la source
Oui, c'est ce que je cherchais ..! :) tout est clair maintenant! Je vous remercie!
jaczjill
très belle réponse. les connaissances obtenues à partir de votre message sont d'une meilleure compréhension que ce technet.microsoft.com/en-us/library/ms180031.aspx
kashif
6

Non, cela ne vous aide pas à savoir où l'erreur s'est produite. Voici un petit exemple. Si vous essayez de diviser par 0, vous obtenez un message d'erreur avec un tas de détails:

SELECT 1/0;

Résultat:

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

Voir celui appelé State, avec une valeur de 1? ERROR_STATE()renvoie cette valeur. Donc, si vous utilisez TRY/CATCH:

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

Résultat:

----
   1

C'est tout. Pas utile dans la plupart des scénarios. Je suggère de lire davantage sur la gestion des erreurs en général avant de plonger trop profondément dans des fonctions spécifiques qui semblent utiles.

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

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

Aaron Bertrand
la source
Merci, ça a un peu aidé. n'a pas pu voter votre réponse car je n'ai pas le privilège requis. Cependant, je voulais obtenir la raison de l'existence de cette fonction avec son exemple. MSDN dit que ERROR_STATE () renvoie le numéro d'état d'erreur, alors que dois-je faire avec ça !!
2
@jaczjill, parfois, vous souhaiterez que votre application réponde d'une certaine manière en fonction de error_state et de la complexité de votre architecture de gestion des erreurs, mais je soupçonne que la gestion des erreurs dans son ensemble est rare. Beaucoup plus courant avec le numéro d'erreur lui-même (piégeage d' erreurs spécifiques ) ou la gravité de l'erreur. Je ne me souviens pas avoir vu quelqu'un utiliser l'état d'erreur de manière significative, sauf dans des démos montrant qu'il existe.
Aaron Bertrand
bien, merci Aaron :) Aussi, pourriez-vous définir une prime pour cette question? afin que certains techniciens prennent le défi d'obtenir sa réponse EXACTE. Sinon, vous êtes l'homme gagnant.
4
Ouais @AaronBertrand a mis en place un tas de vos propres points pour rivaliser avec votre bonne réponse.
Zane
2
@jaczjill Il n'y a pas autant de techniciens qui en savent plus sur SQL Server qu'Aaron, et la plupart d'entre eux n'apparaissent jamais ici. Et votre question est répondue ici (probablement aussi exactement que possible).
dezso
1

Réponse courte - ça ne peut pas. Un ERROR_STATE est essentiellement une sous-division d'un ERROR_NUMBER. Il ne peut pas vous dire quelle ligne de code a provoqué l'erreur (sauf dans la mesure où ERROR_NUMBER et ERROR_STATE ensemble vous indiquent la cause de l'erreur, et il devient alors évident quelle est la cause).

RB.
la source
Conceptuellement compris qu'il doit toujours être utilisé avec la fonction ERROR_NUMBER (). Cependant, un exemple de son utilisation ERROR_STATE () avec ERROR_NUMBER () clarifiera complètement l'image. OU tout bon lien de référence sera suffisant.