SQLスクリプトファイルを実行するときに、SQLCMDを取得して、発生したエラーや警告を出力する方法を教えてください。
基本的に、情報ベースのメッセージを出力したくない。
-r0
この場合、エラーはを使用してファイルにリダイレクトする2>
か、通常のメッセージがを介してリダイレクトされているときに表示できます>
。詳細は私の回答をご覧ください。
SQLスクリプトファイルを実行するときに、SQLCMDを取得して、発生したエラーや警告を出力する方法を教えてください。
基本的に、情報ベースのメッセージを出力したくない。
-r0
この場合、エラーはを使用してファイルにリダイレクトする2>
か、通常のメッセージがを介してリダイレクトされているときに表示できます>
。詳細は私の回答をご覧ください。
回答:
デフォルトでは、SQLCMDはすべての非エラーメッセージとエラーメッセージをstdoutに送信します。したがって、出力をリダイレクトしようとしても役に立ちません。
1つまたは他のタイプのメッセージ(エラーまたは非エラー)のみを取得するために最初に行う必要があるのは、エラーメッセージ(重大度レベル11以上)をstderrに送信することにより、SQLCMDにそれらを分離するように指示することです。これを行うには、コマンドラインスイッチを使用し、そのスイッチのオプションとして指定します(つまり)。この時点で、SQLCMDの実行と、画面に表示されたすべてのタイプのメッセージの表示に関して、目に見える違いはありません。-r
0
-r0
次の部分は、stdoutに送信される通常のメッセージを除外することです。これは、stdoutメッセージをを介してどこかにリダイレクトすることによって実行できますが、どこにリダイレクト>
しますか?でき> file.txt
ますが、最初からやりたくないメッセージのファイルが欲しいとは思いません。幸いなことに、DOSがありNUL
(あるキーワードではない:それは1を持っているtypeo L
のように動作し、ない2)/dev/null
Unixのでは。つまり、次を使用して出力を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.
以下が機能します:
sqlcmd -U user -P pass -S Server -Q "sp_who" -r0 1> test.log
クエリの出力はログに記録され、画面には何も表示されません。
詳細については、sqlcmdに関するMSDNの記事を参照してください。
-r1
送るすべてにメッセージをstderrを含めた、PRINT
とRAISERROR('', 10, 1)
のメッセージ。test.logにリダイレクトされるように、-r0
これらの通常の情報メッセージをstdoutに送信し続けるために使用する必要があります。
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を含めた、PRINT
とRAISERROR('', 10, 1)
のメッセージ。-r0
これらの通常の情報メッセージがstdoutに送信されるようにして、それらがinstall.logにリダイレクトされるようにする必要があります。
2> Err.txt
でリダイレクトできますが、出力がSQLCMD
分割されないようです。