2011-04-26 4 views
10

일부 .sql 파일에 구문 오류가있을 때 SQLCMD 유틸리티에서 % ERRORLEVEL %을 어떻게 얻을 수 있습니까? 이러한 파일은 저장 프로 시저를 만듭니다. 그들은 "raiseerror"를 호출하지는 않지만, 구문 오류를 일으킬 수 있으며 프로세스를 종료해야합니다. 하지만 항상 % ERRORLEVEL %를 0으로 반환합니다. -b, -V 및 -m (및 그 조합)을 사용하려고했지만 예상대로 작동하지 않았습니다.BAT 파일의 SQLCMD 유틸리티 - 구문 오류 인 경우 ERRORLEVEL을 반환하는 방법

다음은 BAT 파일의 코드입니다.

REM process all sql files in "SQL\scripts" folder and subfolders 
FOR /R "SQL\scripts" %%G IN (*.sql) DO (
    sqlcmd -d %1 -S %2 -U %3 -P %4 -i "%%G" -b -V 1 

    echo %ERRORLEVEL% 
    IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL% 
) 

답변

10

당신은 enabledelayedexpansion과 함께 -b 스위치하지만, 당신은 루프 내부 !errorlevel!를 사용하고 예상 결과를 얻을 수있는 방법이 필요합니까.

sqlcmd을 실행하기 전에 어느 곳에서나 setlocal enabledelayedexpansion을 입력하십시오. 배치의 시작 부분이나 루프 바로 앞부분에 가장 좋습니다. 또한 지연 확장 사용을 나타내는 백분율 기호 (%) 대신 느낌표 (!)를 사용하십시오.

가 [나는 또한 if not errorlevel 0 …으로 (더 ! 않으며, 어떤 % : help if 참조) 테스트 없지만 내가 원하는 결과를 얻을 수 없었다]

+0

감사합니다. 정확하게 알고 싶습니다. – kovalu

0

감사합니다, 여기에 작업 일괄 처리 스크립트입니다.

@ECHO OFF 
setlocal enabledelayedexpansion 
FOR /R "C:\SQL" %%G IN (*.sql) DO (
sqlcmd -S%1 -d tangoDB -E -h-1 -w255 -i "%%G" -b 
echo %%G - !ERRORLEVEL! 
IF !ERRORLEVEL! NEQ 0 EXIT /B !ERRORLEVEL! 
)