¿Cómo descargo el buffer de impresión en TSQL?

Tengo un procedimiento almacenado muy largo en SQL Server 2005 que estoy intentando depurar, y estoy usando el comando ‘print’ para hacerlo. El problema es que solo recibo los mensajes de SQL Server al final de mi sproc. Me gustaría poder descargar el búfer de mensajes y ver estos mensajes de inmediato durante el tiempo de ejecución de sproc, en lugar de en el mismo fin.

Use la función RAISERROR :

 RAISERROR( 'This message will show up right away...',0,1) WITH NOWAIT 

No debe reemplazar completamente todas sus impresiones con raiserror. Si tiene un bucle o un cursor grande en alguna parte, solo hágalo una o dos veces por iteración o incluso cada varias iteraciones.

Además: aprendí por primera vez acerca de RAISERROR en este enlace, que ahora considero la fuente definitiva sobre el manejo de errores de SQL Server y definitivamente vale la pena leerlo:
http://www.sommarskog.se/error-handling-I.html

Sí … El primer parámetro de la función RAISERROR necesita una variable NVARCHAR. Entonces intente 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 

Otra opción mejor es no depender de PRINT o RAISERROR y simplemente cargar sus instrucciones de “impresión” en una tabla ## Temp en TempDB o una tabla permanente en su base de datos que le dará visibilidad de los datos inmediatamente a través de una instrucción SELECT desde otra ventana . Esto funciona lo mejor para mí. El uso de una tabla permanente también sirve como registro de lo que sucedió en el pasado. Las instrucciones de impresión son prácticas para los errores, pero al usar la tabla de registro también puede determinar el punto exacto de falla en función del último valor registrado para esa ejecución en particular (suponiendo que rastrea la hora de inicio de la ejecución general en la tabla de registro).

Sobre la base de la respuesta de @JoelCoehoorn, mi enfoque es dejar todas mis declaraciones PRINT en su lugar, y simplemente seguirlas con la instrucción RAISERROR para causar el color.

Por ejemplo:

 PRINT 'MyVariableName: ' + @MyVariableName RAISERROR(N'', 0, 1) WITH NOWAIT 

La ventaja de este enfoque es que las instrucciones PRINT pueden concatenar cadenas, mientras que RAISERROR no puede. (De todos modos, tiene la misma cantidad de líneas de código, ya que tendría que declarar y establecer una variable para usar en RAISERROR).

Si, como yo, utilizas AutoHotKey o SSMSBoost o una herramienta equivalente, puedes configurar fácilmente un atajo como “] flush” para ingresar a la línea RAISERROR por ti. Esto le ahorra tiempo si es la misma línea de código cada vez, es decir, no necesita ser personalizado para contener texto específico o una variable.

Solo como referencia, si trabaja en scripts (procesamiento por lotes), no en el procedimiento almacenado , la salida de enjuague se desencadena mediante el comando GO, por ejemplo

 print 'test' print 'test' go 

En general, mi conclusión es la siguiente: el resultado de la ejecución del script mssql, que se ejecuta en SMS GUI o con sqlcmd.exe, se vacía a file, stdoutput, gui window en la primera instrucción GO o hasta el final del script.

El enjuague dentro de las funciones del procedimiento almacenado es diferente, ya que no puede colocar GO dentro.

Referencia: statement de tsql Go