¿Cómo puedo vaciar el buffer de IMPRESIÓN en TSQL?


Tengo un procedimiento almacenado de ejecución muy larga en SQL Server 2005 que estoy tratando de depurar, y estoy usando el comando 'print' para hacerlo. El problema es que solo obtengo los mensajes de SQL Server al final de mi sproc-me gustaría poder vaciar el búfer de mensajes y ver estos mensajes inmediatamente durante el tiempo de ejecución del sproc, en lugar de al final.

Author: Erik Forbes, 2008-11-21

5 answers

Utilice el RAISERROR función:

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 algún lugar, hágalo una o dos veces por iteración o incluso cada varias iteraciones.

También: Aprendí por primera vez sobre RAISERROR en este enlace, que ahora considero la fuente definitiva sobre el manejo de errores de SQL Server y definitivamente vale la pena leerla:
http://www.sommarskog.se/error-handling-I.html

 276
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-03 02:09:33

Sí... El primer parámetro de la función RAISERROR necesita una variable NVARCHAR. Así que 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
 17
Author: tcbrazil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-30 13:51:28

Otra mejor opción es no depender de PRINT o RAISERROR y simplemente cargar sus sentencias "print" en una tabla ##Temp en TempDB o una tabla permanente en su base de datos que le dará visibilidad a los datos inmediatamente a través de una sentencia 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 instrucciones de impresión son útiles para errores, pero utilizando la tabla de registro también puede determinar el punto exacto de error basado en el último valor registrado para esa ejecución en particular (suponiendo que realice un seguimiento de la hora de inicio de la ejecución general en la tabla de registros.)

 9
Author: Eric Isaacs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-18 20:43:35

Basándome en la respuesta de @JoelCoehoorn, mi enfoque es dejar todas mis declaraciones IMPRESAS en su lugar, y simplemente seguirlas con la declaració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 el RAISERROR no. (Así que de cualquier manera tienes el mismo número de líneas de código, como tendrías que declarar y establecer una variable para usar en RAISERROR).

Si, como yo, utilizas AutoHotkey o SSMSBoost o una herramienta equivalente, puede configurar fácilmente un acceso directo como"] flush " para ingresar la línea RAISERROR por usted. 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.

 9
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-11 00:51:18

Solo para la referencia, si trabaja en scripts (procesamiento por lotes), no en el procedimiento almacenado , la salida de descarga se activa con el comando GO, por ejemplo,

print 'test'
print 'test'
go

En general, mi conclusión es la siguiente: salida de ejecución de script mssql, ejecutándose en interfaz gráfica de usuario SMS o con sqlcmd.exe, se descarga a file, stdoutput, gui window 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 puede colocar GO dentro.

Referencia: declaración tsql Go

 3
Author: Robert Lujo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-21 16:54:31