SQLサーバにフラットファイルデータを読み込む複数のBCPコマンドを含む複雑なバッチスクリプトがあります。私は、コマンドの結果をログファイルに記録するブランチステートメントを使用しています。これはすべて正常に動作しています。コマンドの結果が変数に取り込まれていません
結果は、SQLテーブルにも成功または失敗として記録されます。私がしようとしているのは、失敗したときに、単純なリダイレクトだと思ったことを使って、ログファイルの内容をSQLログテーブルに挿入することです。それは動作していません。ここで
は私が勝つServer 2012の環境でのバッチファイルでやっているものです:
BCP (the parameters here don't matter) >> %LogFile% (
MOVE %FileName% to Archive/%FileName%
sqlcmd -E -Q "EXEC spImportLog 'SUCCESS', %FileName%, ''
) || (
SET /p LogText=<%LogFile%
sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, %LogText%
)
このコードは、エラーなしで実行されます。この声明の真の部分はうまくいきます。 偽の部分は正常に実行されますが、%LogText%の内容は の代わりに空の文字列になります。それは実行時に動的に命名されているので
%ログファイル%は可変である< 0Log_2016_9_23.log
SET/PのLogText:私は、コマンドプロンプトからこれを実行すると
は、SETは次のようになります今日の日付に基づいています。私は、記号の後ろにある0がどこから来ているのか、それとも私の問題の原因であるのか分かりません。何か案は?
'BCP'コマンドラインの最後に最後の'( '...' BCP'はバッチファイルですか?)が 'call'の前にある場合は' && ' LogText'を使用すると、同じコードブロック内でその変数を変更したり変更したりするときに、[遅延拡張](http://ss64.com/nt/delayedexpansion.html)が必要になります。 – aschipfl
はい、直前に&&があります(。私は元のコードをBCP(私のパラメータ)>>%LogFile%&&(true statement)で編集しました。 (SET/p LogText = <%LogFile%sqlcmd -E -Q "EXEC spImportLog 'FAILED、%FileName%,! LogText!) –
遅延拡張は、バッチファイルの先頭に設定され、最後に停止します。 –