Утилита SQLCMD из файла BAT - как вернуть ERRORLEVEL в случае синтаксической ошибки

Как я могу получить% ERRORLEVEL% от утилиты SQLCMD, когда некоторые из .sql файлов содержат синтаксическую ошибку? Эти файлы создают хранимые процедуры. Они не ссылаются на "raiseerror", но могут привести к синтаксической ошибке conatin, и мне нужно прекратить процесс. Но он всегда возвращает% ERRORLEVEL% как 0. Я пробовал использовать -b, -V и -m (и их комбинации), но ничего не работало для меня, как ожидалось.

Здесь фрагмент кода моего 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%
)

Ответ 1

Вам нужен переключатель -b, но вместе с enabledelayedexpansion, таким образом вы можете использовать !errorlevel! внутри цикла и получить ожидаемые результаты.

Поместите setlocal enabledelayedexpansion куда угодно, прежде чем вы выполните sqlcmd, вероятно, лучше всего в начале партии или непосредственно перед циклом. Также обратите внимание на использование восклицательных знаков (!) вместо знака процента (%), что означает использование замедленного расширения.

[Я также тестировал с помощью if not errorlevel 0 … (no !, а не %: см. help if), но я не смог получить желаемые результаты]

Ответ 2

Спасибо, вот рабочая партия script.

@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!
)