print length len hasta ejemplos charindex caracter sql-server tsql

sql-server - length - sql substring hasta un caracter



Instrucción PRINT en T-SQL (6)

¿Tiene salidas que están asociadas con estas declaraciones impresas? si es así, he encontrado que si la variable no tiene valor, la declaración de impresión no se publicará.

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


El analizador de consultas almacena temporalmente los mensajes. Las instrucciones PRINT y RAISERROR utilizan este búfer, pero la instrucción 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 usará 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 vaciará el búfer de mensajes, por lo que también se generará toda la información previamente almacenada.


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

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

Si usa el Analizador de consultas SQL, verá que hay dos pestañas abajo, una de las cuales es "Mensajes" y que es donde aparecerán las declaraciones de ''impresión''.
Si le preocupa el momento de ver las declaraciones impresas, puede intentar usar algo como

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

Esto le dará el mensaje inmediatamente cuando se llegue a la declaración, en lugar de almacenar en búfer el resultado, como lo hará el Analizador de consultas bajo la mayoría de las condiciones.


La instrucción Print en TSQL es una criatura incomprendida, probablemente por su nombre. De hecho, envía un mensaje al mecanismo de gestión de errores / mensajes que luego lo transfiere a la aplicación de llamada. PRINT es bastante tonto. 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, está limitado a una cadena de 2.044 caracteres. Sin embargo, es mucho más fácil usarlo para enviar información a la aplicación llamante, ya que llama a una función de formateo similar a la anterior printf en la biblioteca C estándar. 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 que los mensajes se registren.

Sus rutinas de manejo de errores no serán útiles para recibir mensajes, a pesar de que los mensajes y errores sean muy similares. La técnica varía, por supuesto, según la forma real de conectarse a la base de datos (OLBC, OLEDB, etc.). Para recibir y tratar los mensajes del Motor de base de datos de SQL Server, cuando use System.Data.SQLClient, deberá crear un delegado SqlInfoMessageEventHandler, identificando el método que maneja el evento, para escuchar el evento InfoMessage. en la clase SqlConnection. Encontrará que la información del contexto del mensaje, como la gravedad y el estado, se pasa 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á cargando en un archivo, porque siempre va a ser útil cuando intenta 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 muestre cosas en la aplicación.


Para el beneficio de cualquier otra persona que lea esta pregunta que realmente le faltan las declaraciones de impresión de su salida, en realidad hay casos en que la impresión se ejecuta pero no se devuelve al cliente. No puedo decirte específicamente qué son. Puedo decirle que si coloca una declaración de ir inmediatamente antes y después de cualquier declaración de impresión, la verá si se ejecuta.


Recientemente me encontré con esto, y terminó siendo porque tenía una declaración de conversión en una variable nula. Como eso causaba errores, la declaración de impresión completa se mostraba nula 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'')