.sql 스크립트가 실패 할 때 sqlcmd가 0 이외의 ERRORLEVEL을 반환하도록 만드는 방법은 무엇입니까?


38

배치 파일에서 sqlcmd를 실행 중이며 백업에 문제가있을 때 0 이외의 ERRORLEVEL을 반환하는 방법이 궁금합니다.


배치 파일보다 더 강력한 (특히 오류 처리시) 사용을 고려 했습니까?
Aaron Bertrand

오 파워 쉘을 의미합니까? 우리는 우리가 사용하는 제품에 대해 회사가 권장하는 방법을 사용했습니다. 문제 해결 방법은 하나의 데이터베이스를 백업한다고 가정하는 권장 방법입니다. 하지만 그 장애물을 극복했습니다. 따라서 백업이 작동하지 않으면 오류 코드를 던질 수있는 방법이 없습니까?
leeand00

3
현재 직장에서는 Ola Hallengren의 백업 저장 프로 시저 (일부 사내 랩퍼 저장 프로 시저와 함께)를 사용하여 수백 대의 서버에서 수천 개의 데이터베이스를 백업하고 문제가 없었습니다.
James L

답변:


53

sqlcmd에서 -b 옵션을 사용해야합니다.

-b 오류 발생시 sqlcmd가 종료되고 DOS ERRORLEVEL 값을 반환하도록 지정합니다. SQL Server 오류 메시지의 심각도가 10보다 큰 경우 DOS ERRORLEVEL 변수에 리턴되는 값은 1입니다. 그렇지 않으면 반환 된 값은 0입니다.

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


9

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을 가져올 수 없습니다. 내 코드에 문제가 있거나 내 환경에 문제가있을 수 있습니다.


1
RAISERROR의 첫 번째 매개 변수로 숫자 값을 제공하는 경우에만 작동한다는 것을 알았습니다. 예를 들어이 리턴 % ERRORLEVEL % = 1 : RAISERROR (50002, 10127) 그러나이 돌아 % ERRORLEVEL % = 0 : RAISERROR (10127 'myErrMsg.')

5
마지막 단락에 관한 참고 : ERRORLEVELSQL Server에서보고 된 오류 번호와 동일한 값이 아니어야합니다. ErrorNumber는 SQL Server 관련 값 (예 : SQL Server)이 종료 된 이유를 나타냅니다. 반면, ERRORLEVELSQLCMD 특정 값 (예 : SQLCMD)이 종료 된 이유를 나타냅니다.
Solomon Rutzky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.