Standardmäßig sendet SQLCMD alle Nicht-Fehlermeldungen und Fehlermeldungen an stdout . Daher hilft der Versuch, die Ausgabe umzuleiten, nicht weiter.
Das erste, was Sie tun müssen, um nur den einen oder anderen Nachrichtentyp (Fehler oder Nichtfehler ) zu erhalten, ist, SQLCMD anzuweisen , diese zu trennen, indem Sie die Fehlermeldungen (Schweregrad 11 oder höher) an stderr senden . Sie tun dies, indem Sie den -r
Befehlszeilenschalter verwenden und 0
als Option für diesen Schalter (dh -r0
) angeben . Zu diesem Zeitpunkt gibt es keinen sichtbaren Unterschied hinsichtlich der Ausführung von SQLCMD und der Anzeige von Nachrichten jeglicher Art, die auf dem Bildschirm angezeigt werden.
Der nächste Teil besteht darin, die regulären Nachrichten herauszufiltern, die an stdout gesendet werden . Dies kann durch Umleiten der Standardnachrichten an einen beliebigen Ort erfolgen >
, aber wohin? Sie könnten es tun > file.txt
, aber ich bezweifle, dass Sie eine Datei mit den Nachrichten möchten, mit denen Sie nicht beginnen wollten. Glücklicherweise hat DOS das NUL
Schlüsselwort (das ist kein Tippfehler: es hat eins L
, nicht zwei), das wie /dev/null
in Unix funktioniert . Das heißt, Sie können Folgendes verwenden, um die Ausgabe nach nirgendwo umzuleiten : > NUL
.
Im Folgenden wird der PRINT
Befehl ausgeführt und keine Ausgabe angezeigt, da keine Fehler generiert werden und keine Datei erstellt wird, die die Ausgabe des PRINT
Befehls enthält:
CD %TEMP%
SQLCMD -E -Q "print 1;" -r0 > NUL
Im Folgenden wird jedoch eine Fehlermeldung angezeigt, da diese nicht umgeleitet werden NUL
:
CD %TEMP%
SQLCMD -E -Q "print a;" -r0 > NUL
Kehrt zurück:
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
, aber es sieht so aus, als würdeSQLCMD
die Ausgabe nicht aufgeteilt.