¿Cómo hacer que SQLCMD solo muestre errores y advertencias?


8

¿Cómo puede hacer que SQLCMD, al ejecutar un archivo de script SQL, solo muestre los errores o advertencias que encuentra?

Básicamente, no quiero que se envíen mensajes basados ​​en información.


Hmm, en otra aplicación podríamos redirigir la salida de error 2> Err.txt, pero parece SQLCMDque no divide su salida.
Jon of All Trades

2
@JonofAllTrades De manera predeterminada, sí, SQLCMD envía toda la salida a stdout . Sin embargo, puede indicarle a SQLCMD que envíe errores a stderr a través del -r0conmutador de línea de comandos, en cuyo caso pueden redirigirse a un archivo usando 2>, o pueden mostrarse mientras se redirigen mensajes regulares >. Por favor vea mi respuesta para más detalles.
Solomon Rutzky

Respuestas:


4

De manera predeterminada, SQLCMD envía todos los mensajes sin error y mensajes de error a stdout . Por lo tanto, intentar redirigir la salida no ayudará.

Lo primero que debe hacer para obtener solo uno u otro tipo de mensajes (error o no error) es decirle a SQLCMD que los separe enviando los mensajes de error (nivel de gravedad 11 o superior) a stderr . Para ello, utilice el -rmodificador de línea de comandos, especificando 0como la opción para ese modificador (es decir -r0). En este punto no hay una diferencia visible en términos de ejecutar SQLCMD y ver mensajes de cualquier tipo que se muestran en la pantalla.

La siguiente parte es filtrar los mensajes regulares que van a stdout . Esto se puede hacer redirigiendo los mensajes estándar a algún lugar a través de >, pero ¿hacia dónde? Podría hacerlo > file.txt, pero dudo que quiera un archivo de los mensajes con los que no quería comenzar. Afortunadamente, DOS tiene la NULpalabra clave (que no es un tipo: tiene una L, no dos) que funciona como /dev/nullen Unix. Lo que significa que puede utilizar el siguiente a la salida de redirección a ninguna parte: > NUL.

Lo siguiente ejecutará el PRINTcomando y no mostrará ningún resultado, ya que no se generan errores y no se crea ningún archivo que contenga el resultado del PRINTcomando:

CD %TEMP%

SQLCMD -E -Q "print 1;" -r0 > NUL

Pero a continuación se muestra un mensaje de error, ya que no se redirige a ellos NUL:

CD %TEMP%

SQLCMD -E -Q "print a;" -r0 > NUL

Devoluciones:

Msg 128, Level 15, State 1, Server DALI, Line 1
The name "a" is not permitted in this context. Valid expressions are constants,
constant expressions, and (in some contexts) variables. Column names are not permitted.

1

Lo siguiente funcionará:

sqlcmd -U user -P pass -S Server -Q "sp_who" -r0 1> test.log

El resultado de la consulta se colocará en el registro y no se imprimirá nada en la pantalla.

Más detalles en el artículo de MSDN sobre sqlcmd .


En realidad, esto no funciona de acuerdo con el pedido "esencialmente no quiero que se envíen mensajes basados ​​en información " (mi énfasis). La cuestión es que -r1envía los mensajes a stderr , incluyendo PRINTy RAISERROR('', 10, 1)mensajes. Es necesario utilizar -r0para mantener los mensajes de información regulares que van a la salida estándar de tal manera que se les redirige a test.log .
Solomon Rutzky

1
@srutzky Gracias, modifiqué mi respuesta para reflejar tu comentario.
LowlyDBA

0

Encontré esto en SQLServerCentral

sqlcmd -E -i"install.sql" -r1 2> install-err.log 1> install.log

http://www.sqlservercentral.com/Forums/Topic536968-146-1.aspx


En realidad, esto no funciona de acuerdo con el pedido "esencialmente no quiero que se envíen mensajes basados ​​en información " (mi énfasis). La cuestión es que -r1envía los mensajes a stderr , incluyendo PRINTy RAISERROR('', 10, 1)mensajes. Debe usar -r0para mantener esos mensajes de información regulares que se enviarán de manera tal que se redirijan a install.log .
Solomon Rutzky
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.