Come fare in modo che SQLCMD emetta solo errori e avvisi?


8

Come si può ottenere SQLCMD, quando si esegue un file di script SQL, solo per generare eventuali errori o avvisi che incontra?

Fondamentalmente non voglio che vengano emessi messaggi basati su informazioni.


In un'altra app potremmo reindirizzare l'output dell'errore 2> Err.txt, ma sembra SQLCMDche non divida l'output.
Jon of All Trades,

2
@JonofAllTrades Per impostazione predefinita sì, SQLCMD invia tutto l' output allo stdout . Tuttavia, è possibile indicare a SQLCMD di inviare errori a stderr tramite l' opzione della -r0riga di comando, nel qual caso possono essere reindirizzati a un file utilizzando 2>oppure possono essere visualizzati mentre i messaggi regolari vengono reindirizzati tramite >. Si prega di consultare la mia risposta per i dettagli.
Solomon Rutzky,

Risposte:


4

Per impostazione predefinita, SQLCMD invia tutti i messaggi non di errore e i messaggi di errore a stdout . Quindi, tentare di reindirizzare l'output non aiuta.

La prima cosa che devi fare per ottenere solo l'uno o l'altro tipo di messaggi (errore o non errore) è dire a SQLCMD di separarli inviando i messaggi di errore (livello di gravità 11 o superiore) a stderr . A tale scopo, utilizza l' opzione della -rriga di comando, specificando 0come opzione per tale opzione (ovvero -r0). A questo punto non vi è alcuna differenza visibile in termini di esecuzione di SQLCMD e visualizzazione di messaggi di qualsiasi tipo visualizzati sullo schermo.

La parte successiva è quella di filtrare i normali messaggi che vanno allo stdout . Questo può essere fatto reindirizzando i messaggi stdout da qualche parte tramite >, ma dove? Potresti farlo > file.txt, ma dubito che tu voglia un file dei messaggi con cui non volevi iniziare. Fortunatamente, DOS ha la NULparola chiave (che non è un errore di battitura: ne ha una L, non due) che funziona come /dev/nullin Unix. Significa che è possibile utilizzare il seguente output reindirizzamento verso il nulla: > NUL.

Di seguito eseguirà il PRINTcomando e non mostrerà alcun output in quanto non vengono generati errori e non viene creato alcun file che contenga l'output del PRINTcomando:

CD %TEMP%

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

Ma quanto segue visualizza un messaggio di errore in quanto questi non vengono reindirizzati a NUL:

CD %TEMP%

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

Ritorna:

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

Funzionerà quanto segue:

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

L'output della query verrà inserito nel registro e nulla verrà stampato sullo schermo.

Maggiori dettagli sull'articolo MSDN su sqlcmd .


Questo in realtà non funziona secondo la richiesta "Sostanzialmente non voglio che vengano emessi messaggi basati su informazioni " (la mia enfasi). Il problema è che -r1invia tutti i messaggi a stderr , inclusi PRINTe i RAISERROR('', 10, 1)messaggi. È necessario utilizzare -r0per mantenere quei messaggi informativi regolari andando a stdout in modo che vengano reindirizzati a test.log .
Solomon Rutzky,

1
@srutzky Grazie, ho modificato la mia risposta per riflettere il tuo commento.
LowlyDBA,

0

Trovato su SQLServerCentral

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

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


Questo in realtà non funziona secondo la richiesta "Sostanzialmente non voglio che vengano emessi messaggi basati su informazioni " (la mia enfasi). Il problema è che -r1invia tutti i messaggi a stderr , inclusi PRINTe i RAISERROR('', 10, 1)messaggi. È necessario utilizzare -r0per mantenere quei messaggi informativi regolari andando a stdout in modo che vengano reindirizzati a install.log .
Solomon Rutzky,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.