2016-09-23 5 views
0

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がどこから来ているのか、それとも私の問題の原因であるのか分かりません。何か案は?

+0

'BCP'コマンドラインの最後に最後の'( '...' BCP'はバッチファイルですか?)が 'call'の前にある場合は' && ' LogText'を使用すると、同じコードブロック内でその変数を変更したり変更したりするときに、[遅延拡張](http://ss64.com/nt/delayedexpansion.html)が必要になります。 – aschipfl

+0

はい、直前に&&があります(。私は元のコードをBCP(私のパラメータ)>>%LogFile%&&(true statement)で編集しました。 (SET/p LogText = <%LogFile%sqlcmd -E -Q "EXEC spImportLog 'FAILED、%FileName%,! LogText!) –

+0

遅延拡張は、バッチファイルの先頭に設定され、最後に停止します。 –

答えて

0

YADXP。

SET /p LogText=<%LogFile% 
    setlocal enabledelayedexpansion 
    sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, !LogText! 
    endlocal 

が有効です。 「遅延拡張」


私が言ったように、set /p var=<filenameは、ファイルの最初ラインから変数を設定するには約十億かそこらSOのエントリを参照してください。ファイルは値を累積し、最初は1行(AAUI)の 'None'を含むように設定されているので、がファイルから読み取られる値になります。

ときfor終了、logtextの値を持つことになりますように最後、順番に%logfile%のすべての行を読んで、logtestに(各行の)値を割り当てる必要があり

for /f "usebackqdelims=" %%a in ("%LogFile%") do set "logtext=%%a" 
    setlocal enabledelayedexpansion 
    sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, !LogText! 
    endlocal 

をお試しくださいファイルの行。

+0

私は上記を試しました。私が試したのは、バッチの開始時に遅延拡張を設定し、すべてのBCPコマンドが実行された後に終了するというものですが、これはうまくいきませんでした。 –

+0

sqlcmdステートメントを囲んでいてもうまくいきませんでした。さらに詳しく説明すると、私はLogText変数を 'None'で初期化しました。バッチ。 'なし'は私の中に没頭するものですSET/p LogText = <%LogFile%ステートメントの結果ではなく、ログ・テーブルを使用します。希望が役立ちます。 。 。 –

+0

3つのbcpステートメントを連続して実行するだけで検証できます。 LogFileの状態は変化していません。それは「なし」のままです。 –

0

よろしくお願いします。それは私がやりたいことが可能なように聞こえません。少なくとも私はそれをやろうとしている方法ではありません。私が望むのは、%LogFile%の内容全体をテキストストリームとして変数に格納し、そのテキストストリームをSQLサーバーのvarcharカラムに挿入することです。振り返ってみると、最初の投稿では私が解決しようとしていた問題と全く同じではありませんでした。 SQL Serverの一時テーブルにコマンドの結果(複数行)を格納できることはわかっています。それは、私が避けたいと思っていたxp_cmdshellの使用を必要とするだけです。

関連する問題