SQLCMDでエラーと警告のみを出力する方法は?


8

SQLスクリプトファイルを実行するときに、SQLCMDを取得して、発生したエラーや警告を出力する方法を教えてください。

基本的に、情報ベースのメッセージを出力したくない。


うーん、別のアプリではエラー出力を2> Err.txtでリダイレクトできますが、出力がSQLCMD分割されないようです。
Jon of All Trades 2012年

2
@JonofAllTradesデフォルトでは、はい、SQLCMDはすべての出力をstdoutに送信ます。ただし、SQLCMDにコマンドラインスイッチを介してstderrにエラーを送信するように指示できます。-r0この場合、エラーはを使用してファイルにリダイレクトする2>か、通常のメッセージがを介してリダイレクトされているときに表示できます>。詳細は私の回答をご覧ください。
ソロモンRutzky

回答:


4

デフォルトでは、SQLCMDはすべての非エラーメッセージとエラーメッセージをstdoutに送信します。したがって、出力をリダイレクトしようとしても役に立ちません。

1つまたは他のタイプのメッセージ(エラーまたは非エラー)のみを取得するために最初に行う必要があるのは、エラーメッセージ(重大度レベル11以上)をstderrに送信することにより、SQLCMDにそれらを分離するように指示することです。これを行うには、コマンドラインスイッチを使用し、そのスイッチのオプションとして指定します(つまり)。この時点で、SQLCMDの実行と、画面に表示されたすべてのタイプのメッセージの表示に関して、目に見える違いはありません。-r0-r0

次の部分は、stdoutに送信される通常のメッセージを除外することです。これは、stdoutメッセージをを介してどこかにリダイレクトすることによって実行できますが、どこにリダイレクト>しますか?でき> file.txtますが、最初からやりたくないメッセージのファイルが欲しいとは思いません。幸いなことに、DOSがありNUL(あるキーワードではない:それは1を持っているtypeo Lのように動作し、ない2)/dev/nullUnixのでは。つまり、次を使用して出力をnowhereにリダイレクトできます> NUL

以下はPRINTコマンドを実行し、エラーが生成されず、PRINTコマンドの出力を含むファイルは作成されないため、出力は表示されません。

CD %TEMP%

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

ただし、リダイレクトされていないため、以下はエラーメッセージを表示しますNUL

CD %TEMP%

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

戻り値:

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

以下が機能します:

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

クエリの出力はログに記録され、画面には何も表示されません。

詳細については、sqlcmdに関するMSDNの記事を参照してください


これは、要求された「本質的に情報ベースのメッセージが出力されること望まない」(私の強調)に従って実際には機能しません。問題はそれで-r1送るすべてにメッセージをstderrを含めた、PRINTRAISERROR('', 10, 1)のメッセージ。test.logにリダイレクトされるように、-r0これらの通常の情報メッセージをstdoutに送信し続けるために使用する必要があります。
ソロモンRutzky

1
@srutzkyありがとう、あなたのコメントを反映するように私の答えを変更しました。
LowlyDBA 2015

0

SQLServerCentralでこれを見つけました

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

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


これは、要求された「本質的に情報ベースのメッセージが出力されること望まない」(私の強調)に従って実際には機能しません。問題はそれで-r1送るすべてにメッセージをstderrを含めた、PRINTRAISERROR('', 10, 1)のメッセージ。-r0これらの通常の情報メッセージがstdoutに送信されるようにして、それらがinstall.logにリダイレクトされるようにする必要があります。
ソロモンルツキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.