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 -r
riga di comando, specificando 0
come 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 NUL
parola chiave (che non è un errore di battitura: ne ha una L
, non due) che funziona come /dev/null
in Unix. Significa che è possibile utilizzare il seguente output reindirizzamento verso il nulla: > NUL
.
Di seguito eseguirà il PRINT
comando e non mostrerà alcun output in quanto non vengono generati errori e non viene creato alcun file che contenga l'output del PRINT
comando:
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.
2> Err.txt
, ma sembraSQLCMD
che non divida l'output.