¿Qué es ERROR_STATE () en SQL Server y cómo se puede usar?

13

Leí que ERROR_STATE()puede ayudar a distinguir entre diferentes estados / ubicaciones en el código fuente donde puede ocurrir el mismo tipo de error. Pero no está realmente claro para mí cómo puede ser útil.

Estados de MSDN:

ERROR_STATE() Devuelve el número de estado del error que provocó la ejecución del bloque CATCH de una construcción TRY ... CATCH.

¿Cómo se puede usar realmente? ¿Puede alguien darme un ejemplo, los que se proporcionan en este artículo de referencia realmente no ayudan a explicarme las cosas bien?

jaczjill
fuente
Error_Statey la Error_Numbercombinación le dará una imagen más clara sobre un error. Eche un vistazo a otras funciones relacionadas con el manejo de errores aquí
Ravindra Gullapalli
¡Gracias! Pero también había leído este enlace anteriormente. No ayudó, ya que no se dan buenos ejemplos de esto en MSDN. Es por eso que hice una pregunta aquí.

Respuestas:

9

El propósito de los estados de error de SQL Server es que el equipo de desarrollo de SQL Server pueda identificar en el código el lugar exacto en que se generaron los errores del sistema, dado que muchos errores se generan en varios lugares.

Usted, como usuario final (es decir, desarrollador de aplicaciones que utilizan SQL Server) puede utilizar de manera similar el estado pasado para RAISERRORque el soporte de su producto pueda identificar el lugar donde un procedimiento genera un error, por ejemplo:

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

Vea cómo los dos estados le permiten distinguir más tarde qué caso de error se alcanzó. Antes de decir "pero puedo ver el mensaje de error", le digo una palabra: internacionalización.

Remus Rusanu
fuente
Sí, esto es lo que estaba buscando ...! :) todo claro ahora! ¡Gracias!
jaczjill
Muy buena respuesta. el conocimiento obtenido de su publicación es de mejor comprensión que este technet.microsoft.com/en-us/library/ms180031.aspx
kashif
6

No, no le ayuda a averiguar dónde se produjo el error. Aquí hay un ejemplo rápido. Si intenta dividir por 0, recibirá un mensaje de error con un montón de detalles:

SELECT 1/0;

Resultado:

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

¿Ves el llamado State, con un valor de 1? ERROR_STATE()devuelve este valor Entonces, si usas TRY/CATCH:

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

Resultado:

----
   1

Eso es todo. No es útil en la mayoría de los escenarios. Sugiero leer más sobre el manejo de errores en general antes de profundizar demasiado en funciones específicas que parecen útiles.

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

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

Aaron Bertrand
fuente
Gracias, ayudó un poco. no pude votar tu respuesta ya que no he requerido privilegio. Sin embargo, quería obtener la razón de la existencia de esta función con su ejemplo. MSDN dice que ERROR_STATE () devuelve el número de estado de error, ¡entonces qué hago con eso!
2
@jaczjill a veces querrá que su aplicación responda de cierta manera dependiendo del error_state y la complejidad de su arquitectura de manejo de errores, pero sospecho que manejar los errores en general es raro. Mucho más común con el número de error en sí (atrapando errores específicos ) o la gravedad del error. No recuerdo haber visto a nadie usar el estado de error de manera significativa, excepto en demostraciones que muestran que existe.
Aaron Bertrand
Muy bien, gracias Aaron :) Además, ¿podrías establecer una recompensa por esta pregunta? para que algún técnico lo tome como un desafío para obtener su EXACTA respuesta. De lo contrario, eres el hombre ganador.
44
Sí, @AaronBertrand puso un montón de tus propios puntos para competir contra tu respuesta correcta.
Zane
2
@jaczjill No hay tantos técnicos que sepan más acerca de SQL Server que Aaron, y la mayoría de ellos nunca aparecen aquí. Y su pregunta se responde aquí (lo más probable es que sea lo más exacto posible).
dezso
1

Respuesta corta: no puede. Un ERROR_STATE es esencialmente una subdivisión de un ERROR_NUMBER. No puede decirle qué línea de código causó el error (excepto en la medida en que ERROR_NUMBER y ERROR_STATE juntos le digan la causa del error, y luego se hace obvio cuál es la causa).

RB.
fuente
Entendió conceptualmente que debe usarse siempre con la función ERROR_NUMBER (). Sin embargo, un ejemplo de su uso ERROR_STATE () con ERROR_NUMBER () aclarará la imagen por completo. O cualquier buen enlace de referencia será suficiente.