BAT文件中的SQLCMD实用程序-在出现语法错误时如何返回ERRORLEVEL

BAT文件中的SQLCMD实用程序-在出现语法错误时如何返回ERRORLEVEL,sql,batch-file,syntax-error,sqlcmd,Sql,Batch File,Syntax Error,Sqlcmd,当某些.sql文件包含语法错误时,如何从SQLCMD实用程序获取%ERRORLEVEL%?这些文件创建存储过程。他们不调用“raiseerror”,但他们可以控制语法错误,我需要终止进程。 但它总是将%ERRORLEVEL%返回为0。 我尝试使用-b、-V和-m(以及它们的组合),但没有任何效果 这是我的BAT文件的代码片段 REM process all sql files in "SQL\scripts" folder and subfolders FOR /R "SQL\scripts"

当某些.sql文件包含语法错误时,如何从SQLCMD实用程序获取%ERRORLEVEL%?这些文件创建存储过程。他们不调用“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%
)

您确实需要
-b
开关,但同时需要启用
延迟扩展
,这样您就可以使用
!错误等级并获得预期结果

在执行
sqlcmd
之前的任何位置放置
setlocal enabledelayedexpansion
,最好在批处理的开始或循环之前。还要注意使用感叹号(
)而不是百分号(
%
),这表示使用延迟扩展


[我还测试了
如果不是错误级别0…
(没有
,也没有任何
%
:请参阅
帮助如果
),但我无法获得所需的结果]

谢谢,这是工作批脚本

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

谢谢,这正是我需要知道的。