Wie kann SQLCMD dazu gebracht werden, nur Fehler und Warnungen auszugeben?


8

Wie kann SQLCMD beim Ausführen einer SQL-Skriptdatei dazu gebracht werden, nur Fehler oder Warnungen auszugeben, auf die es stößt?

Ich möchte im Wesentlichen nicht, dass informationsbasierte Nachrichten ausgegeben werden.


Hmm, in einer anderen App könnten wir die Fehlerausgabe umleiten 2> Err.txt, aber es sieht so aus, als würde SQLCMDdie Ausgabe nicht aufgeteilt.
Jon of All Trades

2
@JonofAllTrades Standardmäßig sendet SQLCMD alle Ausgaben an stdout . Sie können SQLCMD jedoch anweisen, Fehler über den Befehlszeilenschalter an stderr zu senden. -r0In diesem Fall können sie mithilfe von in eine Datei umgeleitet 2>oder angezeigt werden, während reguläre Nachrichten über umgeleitet werden >. Bitte sehen Sie meine Antwort für Details.
Solomon Rutzky

Antworten:


4

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 -rBefehlszeilenschalter verwenden und 0als 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 NULSchlüsselwort (das ist kein Tippfehler: es hat eins L, nicht zwei), das wie /dev/nullin Unix funktioniert . Das heißt, Sie können Folgendes verwenden, um die Ausgabe nach nirgendwo umzuleiten : > NUL.

Im Folgenden wird der PRINTBefehl ausgeführt und keine Ausgabe angezeigt, da keine Fehler generiert werden und keine Datei erstellt wird, die die Ausgabe des PRINTBefehls 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.

1

Folgendes wird funktionieren:

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

Die Ausgabe der Abfrage wird in das Protokoll aufgenommen und nichts wird auf dem Bildschirm gedruckt.

Weitere Details finden Sie im MSDN-Artikel auf sqlcmd .


Dies funktioniert nicht gemäß der angeforderten Meldung "Ich möchte im Wesentlichen nicht, dass informationsbasierte Nachrichten ausgegeben werden" (meine Betonung). Das Problem ist , dass -r1sendet alle Nachrichten an stderr , einschließlich PRINTund RAISERROR('', 10, 1)Nachrichten. Sie verwenden müssen , -r0um halten diese regelmäßigen Info - Nachrichten gehen stdout , so dass sie umgeleitet werden test.log .
Solomon Rutzky

1
@srutzky Danke, meine Antwort wurde geändert, um Ihren Kommentar wiederzugeben.
LowlyDBA

0

Fand dies auf SQLServerCentral

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

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


Dies funktioniert nicht gemäß der angeforderten Meldung "Ich möchte im Wesentlichen nicht, dass informationsbasierte Nachrichten ausgegeben werden" (meine Betonung). Das Problem ist , dass -r1sendet alle Nachrichten an stderr , einschließlich PRINTund RAISERROR('', 10, 1)Nachrichten. Sie müssen verwenden -r0, um diese regulären Info-Nachrichten so zu speichern , dass sie zu install.log umgeleitet werden .
Solomon Rutzky
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.