2012-05-30 6 views
0

내 코드는 다음과 같습니다 :명령 프롬프트 오류 수준의 문제 SQLCMD 실행 한 후

CALL:ECHOCOLOR "Executing on server:[S059D526\TCH] db:CS filename:[9990294_UPDATE_Concessions.sql]." Cyan 
SET CURRENT_SCRIPT="9990294_UPDATE_Concessions.sql" 
if not exist "9990294_UPDATE_Concessions.sql" (
    CALL:ECHOCOLOR "skipping execution of file [9990294_UPDATE_Concessions.sql]. Possibly it was renamed because it has already ran" Yellow 
) 
if exist "9990294_UPDATE_Concessions.sql" (
    CALL:ECHOCOLOR "executing script [9990294_UPDATE_Concessions.sql]" Cyan 
    sqlcmd -V 1 -r1 -E -S S059D526\TCH -d "CS" -i "9990294_UPDATE_Concessions.sql" -o "9990294_UPDATE_Concessions.sql.run_20120508_12_19_36.log" 
) 
CALL:ECHORESULT "result [OK=0,ERR=any other]: %errorlevel%" %errorlevel% 
if NOT ERRORLEVEL 0 GOTO FINAL_ERROR 
if exist "9990294_UPDATE_Concessions.sql" rename "9990294_UPDATE_Concessions.sql" "9990294_UPDATE_Concessions.sql.ok" 

나는 데이터베이스 스크립트를 실행 한 후 항상 0을 반환하기 때문이다는 errorlevel 함께 직면 문제 때문에 명령 CALL:ECHORESULT "result [OK=0,ERR=any other]: %errorlevel%" %errorlevel% . 스크립트가 오류와 함께 실행되면 FINAL_ERROR으로 이동하지 않습니다. 스크립트 오류가있을 때 프로세스를 중지하기 위해 유효성 검사를 어떻게 수행 할 수 있는지 모르겠습니다.

답변

1

오류 검사 논리가 잘못되었습니다.

IF ERRORLEVEL N은 errorlevel이> = N이면 true입니다. 따라서 IF NOT ERRORLEVEL 0은 사실이 아닙니다! (오류 수준이 음수가 아닌 것으로 가정).

은 당신이 중 하나

if ERRORLEVEL 1 goto FINAL_ERROR 

또는

if %ERRORLEVEL% neq 0 goto FINAL_ERROR 

또 다른 일을 할 수 있습니다. 테스트하려는 명령 바로 뒤에 ERRORLEVEL을 테스트해야합니다. 나는 :ECHORESULT 루틴이 코딩 된 방법을 모르지만 잠재적으로 현재 ERRORLEVEL 값을 변경할 수 있습니다.