Sqlcmdを使用していくつかのSELECTクエリを実行し、結果をテキストファイルに入れ、それらのファイルをFTPサーバーにアップロードするバッチファイルがあります。それはすべて正常に機能しているので、私は物事がうまく機能するのが好きです。
しかし、エラーが発生した場合はどうすればよいのか疑問に思っていました。誰かが私がヒットしているデータベースのデータ構造を変更し、私に通知しないとしましょう。 sqlcmd SELECTステートメントを実行して結果をテキストファイルにドロップすると、エラーを含むテキストファイルが表示され、何も問題がないかのようにFTPに直接送信されます。 (私はこれをテストしました。)
Sqlcmdからのエラー(タイムアウト、資格情報の誤り、クエリの形式の誤りなど)をチェックできるようにしたいのですが、これがどのように行われるのか、または「ベストプラクティス」が何であるのかわかりません。いつでも出力テキストファイルをクロールして、発生する可能性があると思われるエラーを検索することができましたが、これにはさまざまな理由で問題があります。
誰かがこれについて共有したい経験がありますか?
errorlevel
から返されたSQLCMD
をチェックして、失敗したかどうかを確認できます。
sqlcmd -b <yourscript>
IF ERRORLEVEL 1 goto err_handler
goto done
:err_handler
REM handle the error here
:done
REM script completion code here
次のように、SQLに戻り値を入れることから始めます。
DECLARE @IsBored bit = 1
... do work ...
SELECT 0 -- Success!
もう少し進んで、TRY/CATCHブロックを使用してエラーをトラップし、エラーコードを返すことができます。 SQLCMDを使用すると、次のように、SQLからの戻りコードをアプリケーションの終了コードとして使用できます。
sqlcmd -b -S ServerName -E -d DbName -q "EXIT(EXEC dbo.YourProc)"
-o "C:\Logs\output.log" -u
スケジューラーのようなものを使用してSQLCMD呼び出しを管理している場合は、SQLCMDからの戻りコードに基づいてアクションを実行できます。バッチファイルを使用しているだけなので、次のようなことができると思います。
@ECHO OFF
sqlcmd -b -S ServerName -E -d DbName -q "EXIT(EXEC dbo.YourProc)"
-o "C:\Logs\output.log" -u
IF %ERRORLEVEL% NEQ 0 ECHO "Error"
幸運を!
for %%G in (*.sql) do (sqlcmd /S %sqlhost% /d %sqldbname% -E -b -i "%%G" >> output.txt if ERRORLEVEL 1 exit)
上記のコードは、フォルダー内のすべての* .sqlをループします。スクリプトのいずれかでエラーが発生した場合、エラーはoutput.txtファイルに記録され、バッチプロセスがすぐに停止します。