BAT文件中的SQLCMD实用程序-在出现语法错误时如何返回ERRORLEVEL
当某些.sql文件包含语法错误时,如何从SQLCMD实用程序获取%ERRORLEVEL%?这些文件创建存储过程。他们不调用“raiseerror”,但他们可以控制语法错误,我需要终止进程。 但它总是将%ERRORLEVEL%返回为0。 我尝试使用-b、-V和-m(以及它们的组合),但没有任何效果 这是我的BAT文件的代码片段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"
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!
)
谢谢,这正是我需要知道的。