Утилита SQLCMD из BAT-файла - как вернуть ERRORLEVEL в случае синтаксической ошибки - PullRequest
10 голосов
/ 26 апреля 2011

Как я могу получить% ERRORLEVEL% из утилиты SQLCMD, когда некоторые из файлов .sql содержат синтаксическую ошибку?Эти файлы создают хранимые процедуры.Они не вызывают "Raiseerror", но они могут содержать синтаксическую ошибку, и мне нужно завершить процесс.Но он всегда возвращает% 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%
)

Ответы [ 2 ]

11 голосов
/ 26 апреля 2011

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

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

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

0 голосов
/ 17 апреля 2012

Спасибо, вот рабочий пакетный скрипт.

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