web-dev-qa-db-ja.com

バッチファイルとSqlcmdによるエラー処理

Sqlcmdを使用していくつかのSELECTクエリを実行し、結果をテキストファイルに入れ、それらのファイルをFTPサーバーにアップロードするバッチファイルがあります。それはすべて正常に機能しているので、私は物事がうまく機能するのが好きです。

しかし、エラーが発生した場合はどうすればよいのか疑問に思っていました。誰かが私がヒットしているデータベースのデータ構造を変更し、私に通知しないとしましょう。 sqlcmd SELECTステートメントを実行して結果をテキストファイルにドロップすると、エラーを含むテキストファイルが表示され、何も問題がないかのようにFTPに直接送信されます。 (私はこれをテストしました。)

Sqlcmdからのエラー(タイムアウト、資格情報の誤り、クエリの形式の誤りなど)をチェックできるようにしたいのですが、これがどのように行われるのか、または「ベストプラクティス」が何であるのかわかりません。いつでも出力テキストファイルをクロールして、発生する可能性があると思われるエラーを検索することができましたが、これにはさまざまな理由で問題があります。

誰かがこれについて共有したい経験がありますか?

16
SuperNES

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
13
dcp

次のように、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"

幸運を!

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

上記のコードは、フォルダー内のすべての* .sqlをループします。スクリプトのいずれかでエラーが発生した場合、エラーはoutput.txtファイルに記録され、バッチプロセスがすぐに停止します。

2
knkarthick24