Cuando algo sale mal en su T-SQL, desea solucionar el problema rápidamente con un mínimo de indagaciones e interrupciones para los usuarios. Los mensajes de error generados por SQL Server son muy técnicos y difíciles de entender, lo que puede dificultar el aislamiento de problemas y ralentizar el tiempo de resolución. Afortunadamente, los DBA pueden implementar SQL Server RAISERROR como alternativa a los mensajes de error de SQL Server.
RAISERROR es una declaración de manejo de errores de SQL Server que genera un mensaje de error e inicia el procesamiento de errores. RAISERROR puede hacer referencia a un mensaje definido por el usuario que se almacena en la vista de catálogo sys.messages o puede crear un mensaje de forma dinámica. El mensaje se devuelve como un mensaje de error del servidor a la aplicación que llama o a un bloque CATCH asociado de una construcción TRY...CATCH.
Hay varios escenarios en los que es apropiado utilizar la sentencia RAISERROR:
- Solución de problemas de código Transact-SQL
- Devolver mensajes que contienen texto variable
- Examinar valores de datos
- Cuando necesite que la ejecución salte de un bloque TRY al bloque CATCH asociado o devuelva información de error del bloque CATCH a las personas que llaman
Es importante tener en cuenta que al desarrollar nuevas aplicaciones, una declaración THROW ahora es preferible a RAISERROR para el manejo de errores. Pero hablaremos de eso más adelante.
¿Por qué usar RAISERROR para el manejo de errores de SQL Server?
Hay dos razones principales para elegir RAISERROR sobre el manejo de errores generados por SQL Server:
- Los mensajes RAISERROR son personalizables con respecto al nivel de gravedad y estado
- Se pueden escribir en un lenguaje natural que sea fácil de entender
RAISERROR devuelve mensajes de error a la aplicación en el mismo formato que genera SQL Server Database Engine. Permite a los desarrolladores generar sus propios mensajes de error, por lo que cualquier persona que lea el mensaje podrá comprender cuál es el problema real en lugar de intentar descifrar el mensaje de error técnico de SQL Server. Los desarrolladores también pueden establecer su propio nivel de gravedad, ID de mensaje y estado para los mensajes de error.
Uso de RAISERROR con la construcción TRY...CATCH
TRY...CATCH es una construcción de manejo de errores que le permite ejecutar código en la sección TRY y manejar errores en la sección CATCH. En general, TRY...CATCH es una forma efectiva de identificar muchos errores de T-SQL, pero hay algunas excepciones.
Este tutorial proporciona un recorrido detallado sobre cómo usar RAISERROR junto con TRY...CATCH. El autor usa un ejemplo que muestra cómo usar RAISERROR dentro de un bloque TRY para hacer que la ejecución salte al bloque CATCH asociado. Dentro del bloque CATCH, el autor demuestra cómo usar RAISERROR para devolver la información de error que invocó el bloque CATCH. El resultado muestra el ID del mensaje, el nivel de gravedad y el estado del error.
Sentencias de manejo de errores RAISERROR vs. THROW
RAISERROR se introdujo en SQL Server 7.0 y ha sido una forma eficaz de controlar los errores de T-SQL durante muchos años. Pero si está desarrollando nuevas aplicaciones, Microsoft ahora recomienda usar instrucciones THROW en lugar de RAISERROR.
A medida que las organizaciones se actualizan a SQL Server 2012 y versiones posteriores, RAISERROR se elimina gradualmente. De hecho, RAISERROR no se puede usar en los procedimientos almacenados compilados de forma nativa de SQL Server 2014. THROW se considera una mejora sobre RAISERROR porque es más fácil de usar.
La documentación de SQL Server de Microsoft desglosa las diferencias entre las declaraciones de manejo de errores RAISERROR y THROW de la siguiente manera:
Sentencia RAISERROR
- Si se pasa un msg_id a RAISERROR, el ID debe definirse en sys.messages.
- El parámetro msg_str puede contener estilos de formato printf.
El parámetro de gravedad especifica la gravedad de la excepción.
Echar sentencia
- El parámetro error_number no tiene que definirse en sys.messages.
- El parámetro del mensaje no acepta el formato de estilo printf.
- No hay parámetro de gravedad. La gravedad de la excepción siempre se establece en 16.
Aunque los días de RAISERROR pueden estar contados, sigue siendo una opción viable de manejo de errores en versiones anteriores de SQL Server. Microsoft está presionando a los usuarios de versiones más recientes de SQL Server (SQL SERVER 2012 y posteriores) para que usen la instrucción THROW en lugar de RAISERROR para implementar el manejo de errores. Microsoft aún no ha anunciado la desactivación de RAISERROR, pero parece probable que lo haga más pronto que tarde.