-1

以下のバッチ スクリプトでは、すべてのスクリプトが c:\temp に保持され、スクリプトが 1 つずつ実行され、すべての成功/エラー レコードがログ ファイルに記録されると予想されます。このバッチ スクリプトとすべての SQL スクリプトを 1 つのフォルダーにのみ保存しました

@Echo Off
FOR /f %%i IN ('DIR C:\temp\*.Sql /B') do call :RunScript %%i
GOTO :END

:RunScript
Echo Executing %1
@set SName=someservername
@set DbName=somedbname
@set path=C:\temp

echo sqlcmd -S %SName% -d %DbName% -i %1 -o "%path%\log.txt" 
if not %errorlevel%==0 exit
Echo Completed %1

:END
4

3 に答える 3

0

for %%G in (*.sql) do (sqlcmd /S %sqlhost% /d %sqldbname% -E -b -i "%%G" >> output.txt if ERRORLEVEL 1 exit)

上記のコードは、フォルダー内のすべての *.sql をループします。いずれかのスクリプトでエラーが発生した場合、エラーが output.txt ファイルに記録され、バッチ プロセスが直ちに停止します。上記の 2 行のコードでバッチ ファイルを作成し、フォルダー (C:\temp) に配置します。 )

于 2014-02-14T05:27:48.237 に答える
0

サブルーチンの最後 ("Echo Completed %1" の後) に goto :eof が必要です。そうしないと、呼び出されたサブルーチンから戻りません。あなたのコードは、ファイル名にスペースがないことも前提としています。そうですか?

于 2013-08-20T14:47:25.500 に答える
0

わかりました、最初にエラーを指摘し、その後に解決策を指摘します。わかりませんが、ドキュメントsqlcmdをチェックしています。

FOR /f %%i IN ('DIR C:\temp\*.Sql /B') do call :RunScript %%i

ファイル名にスペースが含まれていると問題になる可能性があります

@set path=C:\temp

すでに述べたように、システム変数の使用は避けてください。SQLCMD は %path%! に依存している可能性があります。

echo sqlcmd -S %SName% -d %DbName% -i %1 -o "%path%\log.txt" 

echoコマンドラインが表示され、実行されません! ドキュメントから、-oパラメーターは「以前のsqlcmdセッションからの同じ名前のファイルが上書きされる」ことを意味します。そのため、 を実行するたびにsqlcmd、以前のログが上書きされます。

if not %errorlevel%==0 exit

コマンド ライン インタープリターの使用exit /bまたはコマンド ライン インタープリターが停止されるため、ネストされたバッチを使用するときにフローが中断される可能性があります。

私のおすすめ:

FOR /F "TOKENS=*" %%i IN ('DIR C:\temp\*.Sql /B') do call :RunScript "%%i"
GOTO :EOF

:RunScript
Echo Executing %1
SQLCMD -S someservername -d somedbname -i %1 -b -m-1 1>> "C:\temp\log.txt"
IF %ERRORLEVEL%==0 EXIT /B
Echo Completed %1

編集:タイプミスの修正

編集:スイッチの修正:-o出力の略。より良い使用-mとキャッチstdout

于 2013-08-21T10:05:04.280 に答える