.sqlスクリプトが失敗したときにsqlcmdが0以外のERRORLEVELを返すようにする方法は?


38

バッチファイルからsqlcmdを実行していますが、バックアップに問題が発生したときに0以外のERRORLEVELを返すようにするにはどうすればよいのでしょうか。


バッチファイルよりも堅牢なもの(特にエラー処理)を使用することを検討しましたか?
アーロンバートランド

ああ、Powershellのような意味ですか?私たちは、使用している製品に対して会社が推奨する方法を採用していました。推奨される方法は、1つのデータベースをバックアップすることを想定しているため、問題が発生します。しかし、私はそのハードルを克服しました。バックアップが機能しない場合にエラーコードをスローする方法はありませんか?
leeand00 14

3
価値があることは、現在の仕事で、オラハレングレンのバックアップストアドプロシージャ(いくつかの社内ラッパーストアドプロシージャを使用)を使用して、数百のサーバーにわたって数千のデータベースをバックアップすることで、問題はありませんでした。
ジェームズL 14

回答:



10

次のMSDN SQLCMDユーティリティページから:http ://msdn.microsoft.com/en-us/library/ms162773.aspx

RAISERRORがsqlcmdスクリプト内で使用され、状態127が発生した場合、sqlcmdは終了し、メッセージIDをクライアントに返します。例えば:

RAISERROR(50001、10、127)

そのため、BACKUP DATABASE...コマンドをTRY...CATCHブロックでラップし、適切なエラーメッセージsqlcmdを生成して、バッチファイルに戻すことができます。

たとえば、次のerrorleveltest.sqlファイルを検討します。

:ON ERROR EXIT
BEGIN TRY
    /* creates error 3147 Backup and restore operations 
            are not allowed on database tempdb */
    BACKUP DATABASE tempdb; 
END TRY
BEGIN CATCH
    DECLARE @msg NVARCHAR(255);
    SET @msg = 'An error occurred: ' + ERROR_MESSAGE();
    RAISERROR (50002, 10, 127);
END CATCH

そして、次の.batファイル:(最初の行は読みやすいように折り返されていますが、1行にする必要があります。)

@echo off
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S "someinstance" -E 
    -i .\errorleveltest.sql
ECHO Errorlevel: %ERRORLEVEL%

これにより、cmd.exeプロンプトから次が返されます。

Msg 18054, Level 16, State 1, Server CP708-D377\MV, Line 9
Error 50002, severity 10, state 127 was raised, but no message with that error number 
was found in sys.messages. If error is larger than 50000, make sure the user-defined 
message is added using sp_addmessage.
Errorlevel: 1

ご覧のとおり、通常の戻り値0ではなくERRORLEVEL 1が返されます。実際のエラー番号(この場合は50002)を反映するERRORLEVELを取得できません。コードに問題があるか、環境に何らかの問題がある可能性があります。


1
RAISERRORの最初のパラメーターとして数値を指定した場合にのみ機能することがわかりました。例えば、この戻りA%ERRORLEVEL%= 1:RAISERROR(50002、10127)しかし、この復帰%ERRORLEVEL%= 0:RAISERROR(10127 'myErrMsg。')

5
最後の段落に関する参考ERRORLEVELまでに、SQL Serverから報告されたエラー番号と同じ値を期待するべきではありません。ErrorNumberは、SQL Server固有の値であり、その理由(つまりSQL Server)が終了した理由を示します。一方、それERRORLEVELはSQLCMD固有の値であり、その理由(つまりSQLCMD)が終了した理由を示します。
ソロモンラッツキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.