배치 파일에서 sqlcmd를 실행 중이며 백업에 문제가있을 때 0 이외의 ERRORLEVEL을 반환하는 방법이 궁금합니다.
배치 파일에서 sqlcmd를 실행 중이며 백업에 문제가있을 때 0 이외의 ERRORLEVEL을 반환하는 방법이 궁금합니다.
답변:
sqlcmd에서 -b 옵션을 사용해야합니다.
-b 오류 발생시 sqlcmd가 종료되고 DOS ERRORLEVEL 값을 반환하도록 지정합니다. SQL Server 오류 메시지의 심각도가 10보다 큰 경우 DOS ERRORLEVEL 변수에 리턴되는 값은 1입니다. 그렇지 않으면 반환 된 값은 0입니다.
MSDN SQLCMD Utility 페이지 ( 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 파일 : (첫 번째 줄은 가독성을 위해 줄 바꿈되지만 한 줄에 있어야합니다.)
@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을 가져올 수 없습니다. 내 코드에 문제가 있거나 내 환경에 문제가있을 수 있습니다.
ERRORLEVEL
SQL Server에서보고 된 오류 번호와 동일한 값이 아니어야합니다. ErrorNumber는 SQL Server 관련 값 (예 : SQL Server)이 종료 된 이유를 나타냅니다. 반면, ERRORLEVEL
SQLCMD 특정 값 (예 : SQLCMD)이 종료 된 이유를 나타냅니다.