Che cos'è ERROR_STATE () in SQL Server e come può essere utilizzato?


13

Ho letto che ERROR_STATE()può aiutare a distinguere tra diversi stati / posizioni nel codice sorgente in cui può verificarsi lo stesso tipo di errore. Ma non è molto chiaro per me come possa essere utile.

Stati MSDN:

ERROR_STATE() Restituisce il numero di stato dell'errore che ha causato l'esecuzione del blocco CATCH di un costrutto TRY… CATCH.

Come può essere veramente usato? Qualcuno può darmi un esempio, quelli forniti in questo articolo di riferimento non aiutano davvero a spiegare bene le cose per me?


Error_Statee la Error_Numbercombinazione ti darà un'immagine più chiara di un errore.
Dai

Grazie! Ma avevo letto anche questo link prima. Non ha aiutato perché non vengono forniti buoni esempi per questo su MSDN. Ecco perché ho sollevato una domanda qui.

Risposte:


9

Lo scopo degli stati di errore di SQL Server è che il team di sviluppo di SQL Server sia in grado di identificare nel codice l'esatta posizione in cui sono stati generati errori di sistema, dato che molti errori vengono generati in più punti.

Come utente finale (ad es. Sviluppatore di applicazioni che utilizzano SQL Server) è possibile utilizzare allo stesso modo lo stato passato in RAISERRORmodo che il supporto del prodotto possa identificare il luogo in cui una procedura genera un errore, ad esempio:

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

Scopri come i due stati ti consentono di distinguere in seguito quale caso di errore è stato riscontrato. Prima di dire "ma posso guardare il messaggio di errore" ti sto dicendo una parola: internazionalizzazione.


Sì, questo è quello che stavo cercando ..! :) ora tutto chiaro! Grazie!
jaczjill

risposta molto bella. le conoscenze ottenute dal tuo post sono di migliore comprensione rispetto a questo technet.microsoft.com/en-us/library/ms180031.aspx
kashif

6

No, non ti aiuta a scoprire dove si è verificato l'errore. Ecco un breve esempio. Se si tenta di dividere per 0, viene visualizzato un messaggio di errore con una serie di dettagli:

SELECT 1/0;

Risultato:

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

Vedi quello chiamato State, con un valore di 1? ERROR_STATE()restituisce questo valore. Quindi se usi TRY/CATCH:

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

Risultato:

----
   1

È tutto. Non utile nella maggior parte degli scenari. Suggerisco di leggere di più sulla gestione degli errori in generale prima di immergersi troppo in profondità in funzioni specifiche che sembrano utili.

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

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


Grazie, mi ha aiutato un po '. non ho potuto votare la tua risposta perché non ho richiesto il privilegio. Tuttavia, volevo ottenere il motivo dell'esistenza di questa funzione con il suo esempio. MSDN dice che ERROR_STATE () restituisce il numero dello stato di errore, quindi cosa devo fare !!

2
@jaczjill a volte vorrai che la tua applicazione risponda in un certo modo a seconda dell'errore_stato e della complessità della tua architettura di gestione degli errori, ma sospetto che la gestione degli errori in generale sia rara. Molto più comune con il numero di errore stesso (intrappolando errori specifici ) o la gravità dell'errore. Non ricordo di aver mai visto nessuno usare lo stato di errore in modo significativo, tranne che nelle dimostrazioni che dimostrano che esiste.
Aaron Bertrand

va bene, grazie Aaron :) Inoltre, potresti impostare una taglia per questa domanda? in modo che alcuni tecnici accettino come sfida per ottenere la sua risposta esatta. Altrimenti sei il vincitore.

4
Sì, @AaronBertrand ha accumulato un sacco di punti per competere con la tua risposta corretta.
Zane

2
@jaczjill Non ci sono così tanti tecnici che sanno di più su SQL Server di Aaron e la maggior parte di loro non si presenta mai qui. E la tua domanda ha una risposta qui (molto probabilmente esattamente come potrebbe andare).
dezso

1

Risposta breve - non può. Un ERROR_STATE è essenzialmente una suddivisione di un ERROR_NUMBER. Non può dirti quale riga di codice ha causato l'errore (tranne nella misura in cui ERROR_NUMBER e ERROR_STATE insieme ti dicono la causa dell'errore, e quindi diventa ovvio quale sia la causa).


Compresi concettualmente che deve essere usato sempre con la funzione ERROR_NUMBER (). Tuttavia, un esempio del suo utilizzo ERROR_STATE () con ERROR_NUMBER () chiarirà completamente l'immagine. O qualsiasi link di riferimento valido sarà sufficiente.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.