IMPRIMIR sentencia en T-SQL


¿Por qué la instrucción PRINT en T-SQL parece funcionar solo a veces? ¿Cuáles son las limitaciones para usarlo? Parece que a veces si se genera un conjunto de resultados, se convierte en una función nula, asumí para evitar corromper el conjunto de resultados, pero podría su salida no salir en otro conjunto de resultados, como el recuento de filas?

Author: ProfK, 2008-11-06

6 answers

Entonces, si tienes una declaración como la siguiente, ¿estás diciendo que no obtienes un resultado de 'impresión'?

select * from sysobjects
PRINT 'Just selected * from sysobjects'

Si está utilizando SQL Query Analyzer, verá que hay dos pestañas abajo en la parte inferior, una de las cuales es "Messages" y ahí es donde aparecerán las instrucciones "print".
Si le preocupa el tiempo de ver las instrucciones de impresión, puede intentar usar algo como

raiserror ('My Print Statement', 10,1) with nowait

Esto le dará el mensaje inmediatamente como el se alcanza la sentencia, en lugar de almacenar en búfer la salida, como lo hará el Analizador de consultas en la mayoría de las condiciones.

 89
Author: David T. Macknet,
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
2008-11-06 11:58:47

La instrucción Print en TSQL es una criatura incomprendida, probablemente debido a su nombre. En realidad, envía un mensaje al mecanismo de manejo de errores/mensajes que luego lo transfiere a la aplicación que llama. La impresión es bastante tonta. Solo puede enviar 8000 caracteres (4000 caracteres unicode). Puede enviar una cadena literal, una variable de cadena (varchar o char) o una expresión de cadena. Si usa RAISERROR, entonces está limitado a una cadena de solo 2,044 caracteres. Sin embargo, es mucho más fácil de usar para enviar información a la aplicación que llama, ya que llama a una función de formato similar a la antigua printf en la biblioteca estándar de C. RAISERROR también puede especificar un número de error, una gravedad y un código de estado además del mensaje de texto, y también se puede usar para devolver mensajes definidos por el usuario creados mediante el procedimiento almacenado del sistema sp_addmessage. También puede forzar el registro de los mensajes.

Sus rutinas de manejo de errores no serán buenas para recibir mensajes, a pesar de mensajes y errores son tan similares. La técnica varía, por supuesto, de acuerdo con la forma real de conectarse a la base de datos (OLBC, OLEDB, etc.). Con el fin de recibir y tratar con los mensajes del motor de base de datos de SQL Server, cuando se está utilizando el sistema.Datos.SqlClient, necesitará crear un delegado SqlInfoMessageEventHandler, identificando el método que maneja el evento, para escuchar el evento InfoMessage en la clase SqlConnection. Usted encontrará que la información del mensaje-contexto como la gravedad y el estado se pasan como argumentos a la devolución de llamada, porque desde la perspectiva del sistema, estos mensajes son como errores.

Siempre es una buena idea tener una forma de obtener estos mensajes en su aplicación, incluso si solo está en cola en un archivo, porque siempre va a haber un uso para ellos cuando se está tratando de perseguir un problema realmente oscuro. Sin embargo, no creo que quiera que los usuarios finales los vean a menos que pueda reservar un nivel informativo que muestra cosas en la aplicación.

 35
Author: ,
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
2008-11-06 19:40:20

El analizador de consultas almacena en búfer los mensajes. Las sentencias PRINT y RAISERROR usan este búfer, pero la sentencia RAISERROR tiene una opción WITH NOWAIT. Para imprimir un mensaje inmediatamente use lo siguiente:

RAISERROR ('Your message', 0, 1) WITH NOWAIT

RAISERROR solo mostrará 400 caracteres de su mensaje y utiliza una sintaxis similar a la función C printf para formatear el texto.

Tenga en cuenta que el uso de RAISERROR con la opción WITH NOWAIT borrará el búfer de mensajes, por lo que toda la información previamente almacenada en búfer será salida también.

 22
Author: JimCarden,
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-05-28 12:39:31

Recientemente me encontré con esto, y terminó siendo porque tenía una sentencia convert en una variable nula. Dado que eso estaba causando errores, toda la instrucción print se estaba renderizando como null, y no se imprimía en absoluto.

Ejemplo-Esto fallará:

declare @myID int=null
print 'First Statement: ' + convert(varchar(4), @myID)

Ejemplo-Esto imprimirá:

declare @myID int=null
print 'Second Statement: ' +  coalesce(Convert(varchar(4), @myID),'@myID is null')
 18
Author: WEFX,
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-12-28 15:14:32

Para el beneficio de cualquier otra persona que lea esta pregunta que realmente carece de instrucciones de impresión de su salida, en realidad hay casos en los que la impresión se ejecuta pero no se devuelve al cliente. No puedo decirte específicamente lo que son. Puedo decirle que si pone una declaración go inmediatamente antes y después de cualquier declaración impresa, la verá si se ejecuta.

 3
Author: JohnOpincar,
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-03-30 20:51:22

¿ Tiene variables que están asociadas con estas instrucciones print como salida? si es así, he encontrado que si la variable no tiene valor, entonces la instrucción print no será salida.

 0
Author: user2574678,
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-19 19:51:12