私はバッチファイルからsqlcmdを実行していて、バックアップで問題が発生したときに0以外のERRORLEVELを返すようにする方法を考えていました。
Sqlcmdでオプション-bを使用する必要があります。
-bエラーが発生すると、sqlcmdが終了し、DOS ERRORLEVEL値を返すことを指定します。 SQL Serverエラーメッセージの重大度レベルが10より大きい場合、DOS ERRORLEVEL変数に返される値は1です。それ以外の場合、返される値は0です。
次の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です。コードに問題があるか、環境に問題がある可能性があります。