sql server - registros - ¿Cómo descargo el búfer de impresión en TSQL?
row_number sql server 2008 ejemplos (5)
Tengo un procedimiento almacenado de larga duración en SQL Server 2005 que estoy tratando de depurar, y estoy usando el comando ''imprimir'' para hacerlo. El problema es que solo estoy recuperando los mensajes de SQL Server al final de mi contrato. Me gustaría poder vaciar el búfer de mensajes y ver estos mensajes de inmediato durante el tiempo de ejecución del programa, en lugar de a la fin.
Otra opción mejor es no depender de PRINT o RAISERROR y simplemente cargar sus declaraciones "de impresión" en una tabla ## Temp en TempDB o en una tabla permanente en su base de datos que le dará visibilidad de los datos inmediatamente a través de una declaración SELECT desde otra ventana . Esto funciona mejor para mí. El uso de una tabla permanente también sirve como un registro de lo que sucedió en el pasado. Las declaraciones de impresión son útiles para los errores, pero al usar la tabla de registro también puede determinar el punto exacto de falla basándose en el último valor registrado para esa ejecución en particular (asumiendo que realiza un seguimiento del tiempo total de inicio de ejecución en su tabla de registro).
Sí ... El primer parámetro de la función RAISERROR necesita una variable NVARCHAR. Así que prueba lo siguiente;
-- Replace PRINT function
DECLARE @strMsg NVARCHAR(100)
SELECT @strMsg = ''Here''''s your message...''
RAISERROR (@strMsg, 0, 1) WITH NOWAIT
O
RAISERROR (n''Here''''s your message...'', 0, 1) WITH NOWAIT
Sobre la base de la respuesta de @JoelCoehoorn, mi enfoque es dejar todas mis sentencias PRINT en su lugar y simplemente seguirlas con la sentencia RAISERROR para provocar el rubor.
Por ejemplo:
PRINT ''MyVariableName: '' + @MyVariableName
RAISERROR(N'''', 0, 1) WITH NOWAIT
La ventaja de este enfoque es que las sentencias PRINT pueden concatenar cadenas, mientras que RAISERROR no puede. (De cualquier manera, tiene el mismo número de líneas de código, ya que tendría que declarar y establecer una variable para usar en RAISERROR).
Si, como yo, usa AutoHotKey o SSMSBoost o una herramienta equivalente, puede configurar fácilmente un acceso directo como "] flush" para ingresar la línea de RAISERROR por usted. Esto le ahorra tiempo si es la misma línea de código cada vez, es decir, no es necesario personalizarlo para contener texto específico o una variable.
Solo para la referencia, si trabaja en scripts (procesamiento por lotes), no en un procedimiento almacenado , el comando GO activa la salida de lavado, por ejemplo
print ''test''
print ''test''
go
En general, mi conclusión es la siguiente: la salida de la ejecución del script mssql, la ejecución en la GUI de SMS o con sqlcmd.exe, se vacía en el archivo, stdoutput, ventana de la interfaz gráfica de usuario en la primera instrucción GO o hasta el final del script.
El lavado dentro del procedimiento almacenado funciona de manera diferente, ya que no se puede colocar GO dentro.
Referencia: declaración tsql Go
Usa la función RAISERROR
:
RAISERROR( ''This message will show up right away...'',0,1) WITH NOWAIT
No debes reemplazar completamente todas tus impresiones con raiserror. Si tiene un bucle o un cursor grande en algún lugar, simplemente hágalo una o dos veces por iteración o incluso solo por varias iteraciones.
También: aprendí por primera vez sobre RAISERROR en este enlace, que ahora considero la fuente definitiva en el manejo de errores de SQL Server y definitivamente vale la pena leerlo:
http://www.sommarskog.se/error-handling-I.html