SQLスクリプトファイルを実行するときに、SQLCMDを取得して、発生したエラーや警告を出力する方法を教えてください。
情報ベースのメッセージが出力されることを本質的に望まない。
デフォルトでは、[〜#〜] sqlcmd [〜#〜]はすべての非エラーメッセージとエラーメッセージをstdoutに送信します。したがって、出力をリダイレクトしようとしても役に立ちません。
1つまたは他のタイプのメッセージ(エラーまたは非エラー)のみを取得するために最初に行う必要があるのは、[〜#〜] sqlcmd [〜#〜]エラーメッセージ(重大度レベル11以上)をstderrに送信してそれらを分離します。これを行うには、-r
コマンドラインスイッチを使用し、そのスイッチのオプションとして0
を指定します(つまり、-r0
)。この時点では、SQLCMDの実行と、画面に表示されるすべてのタイプのメッセージの表示に関して、目に見える違いはありません。
次の部分は、stdoutに送信される通常のメッセージを除外することです。これは、stdoutメッセージを>
を介してどこかにリダイレクトすることで実行できますが、どこに送信しますか? > file.txt
はできますが、最初からやりたくないメッセージのファイルが欲しいとは思いません。さいわい、DOSにはNUL
キーワードがあります(つまり、タイプがではないタイプ:L
が2つではなく1つある) Unixでは/dev/null
のように機能します。つまり、次を使用して出力を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記事 を参照してください。
SQLServerCentralでこれを見つけました
sqlcmd -E -i"install.sql" -r1 2> install-err.log 1> install.log
http://www.sqlservercentral.com/Forums/Topic536968-146-1.aspx