web-dev-qa-db-ja.com

.sqlスクリプトが失敗したときにsqlcmdが0以外のERRORLEVELを返すようにするにはどうすればよいですか?

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

41
leeand00

Sqlcmdでオプション-bを使用する必要があります。

-bエラーが発生すると、sqlcmdが終了し、DOS ERRORLEVEL値を返すことを指定します。 SQL Serverエラーメッセージの重大度レベルが10より大きい場合、DOS ERRORLEVEL変数に返される値は1です。それ以外の場合、返される値は0です。

http://msdn.Microsoft.com/en-us/library/ms162773.aspx

58
Ola Hallengren

次の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が返されます。ERRORLEVELに実際のエラー番号を反映させることができません。この場合は50002です。コードに問題があるか、環境に問題がある可能性があります。

10
Max Vernon