Ошибка уровня командной строки после запуска 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"

Проблема, с которой я сталкиваюсь, связана с errorlevel, потому что после запуска сценария базы данных он всегда возвращает 0. Это связано с тем, что инструкция CALL:ECHORESULT "result [OK=0,ERR=any other]: %errorlevel%" %errorlevel%. Если скрипт запускается с ошибкой, он никогда не переходит в папку FINAL_ERROR. Я не знаю, как я могу выполнить проверку, чтобы остановить процесс, когда у меня есть ошибка сценария.


person dsmaevich    schedule 30.05.2012    source источник


Ответы (1)


Ваша логика проверки ошибок неверна.

IF ERRORLEVEL N истинно, если уровень ошибки >= N. Таким образом, IF NOT ERRORLEVEL 0 никогда не будет истинным! (при условии, что уровни ошибок не являются отрицательными).

Вы хотите либо

if ERRORLEVEL 1 goto FINAL_ERROR

or

if %ERRORLEVEL% neq 0 goto FINAL_ERROR

Еще одна вещь. Вы действительно должны проверить ERRORLEVEL сразу после команды, которую вы пытаетесь протестировать. Я не знаю, как кодируется подпрограмма :ECHORESULT, но потенциально она может изменить текущее значение ERRORLEVEL.

person dbenham    schedule 31.05.2012