Cuando se trabaja con SQL Server, es importante entender las mejores prácticas para el manejo de mensajes informativos y errores. Una idea errónea común es que el comando PRINT debe ser utilizado para todos los mensajes informativos, mientras que RAISERROR solo se utiliza para errores. Sin embargo, esto no es del todo preciso.
El comando PRINT es a menudo uno de los primeros comandos que aprendemos al trabajar con TSQL en SQL Server. Se utiliza para mostrar mensajes al ejecutar un script o procedimiento dentro de SQL Server. Por otro lado, el comando RAISERROR se utiliza típicamente para devolver errores a las aplicaciones que los llaman.
Sin embargo, el nombre “RAISERROR” puede ser confuso. Sugiere que solo debe ser utilizado para errores, cuando en realidad es una función auxiliar para entregar mensajes, que pueden o no ser errores. Esta idea errónea lleva a muchos desarrolladores a seguir utilizando el comando PRINT para mensajes informativos.
Pero hay algunas limitaciones al utilizar el comando PRINT. Según la documentación de Books Online, una cadena de mensaje puede tener hasta 8,000 caracteres si es una cadena no Unicode, y 4,000 caracteres si es una cadena Unicode. Las cadenas más largas se truncarán. Además, puede llevar bastante tiempo imprimir los mensajes PRINT, especialmente si se está ejecutando un script que lleva algún tiempo. Esto puede dejar a la persona que ejecuta el script sin ningún registro útil de lo que ha ocurrido.
El enfoque correcto es utilizar RAISERROR para todo el manejo de mensajes, incluyendo mensajes informativos. Al utilizar RAISERROR, se asegura un enfoque consistente para el manejo de mensajes en su aplicación, ya sean errores o no. También se puede definir una gravedad explícita para cada mensaje, indicando si es un error o no. Además, se tiene la opción de utilizar la opción NOWAIT para transmitir la salida al cliente, lo cual puede ser útil para monitorear el progreso de un script.
Vale la pena mencionar que hay un caso en el que el comando PRINT sigue siendo útil: depurar cadenas SQL dinámicas largas. Tanto PRINT como RAISERROR tienen limitaciones cuando se trata de devolver cadenas largas. En este caso, puede ser necesario construir un procedimiento especializado para imprimir el mensaje completo.
Finalmente, es importante mencionar que hay un nuevo comando llamado THROW, que estará disponible en la próxima versión de SQL Server, conocida como Denali. THROW proporciona funcionalidad similar a RAISERROR, pero desafortunadamente, no tiene la opción NOWAIT.
En conclusión, es mejor utilizar RAISERROR para todo el manejo de mensajes, incluyendo mensajes informativos. Esto asegura un enfoque consistente y proporciona más control sobre los mensajes que se muestran. Sin embargo, el comando PRINT aún puede ser útil en ciertos escenarios, como depurar cadenas SQL dinámicas largas. Estén atentos para el lanzamiento de Denali, que introduce el comando THROW como una alternativa a RAISERROR.