17

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

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

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

誰でも共有したい経験がありますか?

4

4 に答える 4

16

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
于 2011-04-26T19:36:51.460 に答える
10

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

幸運を!

于 2011-04-26T19:38:08.667 に答える
2
for %%G in (*.sql) do (sqlcmd /S %sqlhost% /d %sqldbname% -E -b -i "%%G" >> output.txt if ERRORLEVEL 1 exit)

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

于 2014-02-14T05:20:31.487 に答える
-6

同様の問題を解決するために、Pythonでミニ言語を構築しました。サブプロセス ライブラリを使用すると、sqlcmd を使用してコードを実行し、出力とエラー コードを取得できます。テキスト ファイルに出力する前に出力を解析し、必要に応じてエラー修復状態を確認します。これらの状態は、コードまたはオプションを変更し、sqlcmd を介して送信を再試行できます。他のすべてが失敗した場合は、人間にメールしてください。

もちろん、私はそのように python を使用していたので、sqlcmd をまったく気にせず、データベースへの直接接続のために odbc python ライブラリを使用しただけです。壊滅的な障害が発生した場合、トランザクションをロールバックしたり、対話モードで実行したり、コマンド ファイルなどを介して実行したりできました。

しかし、それは仕事の山です。より単純なエラー チェックを行うには、grep や awk などのフィルターをパイプラインに追加するだけです。または、フレックスで独自のロールを作成します。

于 2011-04-26T19:43:08.417 に答える