Утилита 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!
)