en las instrucciones en línea para el script que crea la base de datos de muestra TSQLTutorJoins a partir de mis columnas anteriores, le recomiendo que utilice osql.exe para ejecutar el script desde el símbolo del sistema. Para demostrar por qué, estoy basando la columna de este mes en RAISERROR y un truco genial que aprendí sobre el uso del parámetro de estado de la instrucción RAISERROR. Usando un valor especial para el parámetro de estado RAISERROR, puede forzar la terminación de un script complejo y evitar su ejecución en la base de datos incorrecta.,
RAISERROR tiene tres componentes principales: el texto de error, la gravedad y el estado. El texto de error puede ser un mensaje codificado o parametrizado o un número de error de un mensaje permanente definido por el usuario. Para crear sus propios mensajes permanentes, consulte SQL Server Books Online (BOL) sobre cómo utilizar el procedimiento almacenado en el sistema sp_addmessage.
la Gravedad tiene varios niveles definidos. Los errores definidos por el desarrollador varían en gravedad de 1 a 16, siendo 16 el más común y el predeterminado. Sin embargo, no todas las severidades funcionan de la misma manera., La tabla 1 muestra las categorías de gravedad, cómo muestran los mensajes en Query Analyzer y cómo se registran opcionalmente en el registro de aplicaciones del visor de eventos. Para registrar mensajes en el Visor de eventos, puede usar con LOG en su sentencia RAISERROR o crear el mensaje permanente usando sp_addmessage con el parámetro with_log establecido en ‘TRUE’. Esta última opción escribirá cada ocurrencia de este error en el registro de la aplicación del visor de eventos, incluso si RAISERROR no especifica con registro., La sintaxis RAISERROR simplificada es
RAISERROR (error, severity, state) WITH LOG
por ejemplo,
RAISERROR ('Test Severity 16', 16, 1) WITH LOG
devuelve el siguiente error a la ventana mensajes en el analizador de consultas:
Error Number InfoServer: Msg 50000, Level 16, State 1, Line 1Error Text Test Severity 16
la primera línea es la información del número de Error, como se describe en la tabla 1. Query Analyzer no muestra esta información para severidad 10. El color de la pantalla cambia de negro para las severidades 1 a 9 a rojo para 11 y superiores. El script de ejemplo de la lista 1 muestra sintaxis e ideas adicionales para usar RAISERROR, incluido el uso de varios idiomas y la parametrización., Para obtener más información sobre el uso de RAISERROR y las diversas severidades, consulte BOL en los siguientes temas: mensajes de Error, niveles de gravedad de mensajes de Error, RAISERROR, uso de RAISERROR, FORMATMESSAGE y xp_logevent.
además de la gravedad, RAISERROR también admite un estado. Muchos scripts de creación de objetos crean una base de datos y luego tablas, procedimientos, etc. dentro de la base de datos recién creada. Pero, ¿qué pasa si el script no creó la base de datos correctamente? Todos los objetos adicionales (por ejemplo,,, tablas, procedimientos) se crearían en su base de datos predeterminada, que para los administradores de sistemas podría ser maestra. Crear todos los objetos de la base de datos definidos por el usuario en la base de datos maestra es exactamente lo que no desea, por lo que cuando está creando scripts de un proceso automatizado, puede incluir un valor para estado que finalice el script si se produce un error fatal (según su definición).
sin embargo, establecer el valor de estado no siempre parece terminar la sesión. Las aplicaciones como Query Analyzer pueden volver a conectarse automáticamente cuando se interrumpe una conexión., Por lo tanto, para ver completamente el beneficio de la opción de Estado, debe usar una herramienta como osql.exe, que no se vuelve a conectar automáticamente después de que se interrumpe una conexión. Aquí hay una manera de probar la opción de estado. Desde el símbolo del sistema, escriba
osql -E -q"RAISERROR('Test Severity 16', 16, 1) WITH LOG"
Este código devuelve
Test Severity 161>
y los que permanecen en osql.exe. Ejecutar la siguiente línea desde un símbolo del sistema:
osql -E -q"RAISERROR('Test State 127', 16, 127) WITH LOG"
devuelve el mensaje de error
Test State 127
y lo devuelve al símbolo del sistema, saliendo de osql.exe. Si utiliza osql.,exe para generar un error con un estado de 127 después de que falle la creación de una base de datos, el estado de error termina la conexión y, en consecuencia, el resto del script, para que no cree objetos en la base de datos incorrecta.
Al principio del script de creación de base de datos TSQLTutorJoins.sql, disponible en el enlace» Descargar el código » en la parte superior de la página, es el siguiente código:
si la base de datos no se crea, la conexión se rompe y la parte de creación de objetos del script no se ejecuta. Lo configuré de esta manera para permitirle determinar cuáles son los errores (p. ej.,, fuera de espacio en disco, ruta incorrecta) antes de que se ejecute el resto del script. Sin este código, si la creación de la base de datos falla y el script continúa, crearía todos los objetos de prueba en su base de datos predeterminada.
cuando automatiza scripts, terminar la ejecución en un error grave puede ser extremadamente útil. Al generar un error con una gravedad alta, registrarlo en el registro de aplicaciones del visor de eventos y, lo que es más importante, elevarlo con un estado de 127, se asegura de que no se creen objetos de script en la base de datos incorrecta., Además, al registrarlo en el registro de aplicaciones del visor de Eventos, tiene una pista de auditoría del evento.