首页 > 解决方案 > 如果返回错误,我如何打破我的 For 循环

问题描述

.sql当一个或多个.sql脚本文件的文件夹中的脚本发生任何错误时,我必须中断 sqlcmd 批处理命令。

for %%G in (*.sql) do sqlcmd -b /S "ServerInstance" /d "DBName" -U "Username" -P "Password" -i "%%G"
IF %ERRORLEVEL% ==1 EXIT /b

这个命令一个一个(按顺序)执行文件夹中的所有文件.sql我的文件夹中有两个脚本文件;第一个脚本在执行时返回错误,这就是我想中断执行的地方,但它不会中断并继续执行文件夹中的第二个脚本。

标签: batch-filesqlcmd

解决方案


由于您if %ErrorLevel%==1在循环之后有查询,因此当然不会退出。

将其移入循环将解决您的问题,尽管我不会检查 ,但我ErrorLevel宁愿1检查它是否不是0

for %%G in (*.sql) do (
    sqlcmd -b /S "ServerInstance" /d "DBName" -U "Username" -P "Password" -i "%%~G"
    if not ErrorLevel 1 exit /B
)

ErrorLevel如果遇到大于或等于的值,这将退出循环1,因此预计您的命令不会产生负值。(这种语法的一个很好的副作用是它不需要延迟变量扩展,这对于像这样的条件是必需的if !ErrorLevel! neq 0。)


一种更好更简单的方法是使用条件执行操作符||,它检查前面命令的退出代码(在大多数情况下与 相同ErrorLevel)并仅在非零值的情况下执行以下命令:

for %%G in (*.sql) do (
    sqlcmd -b /S "ServerInstance" /d "DBName" -U "Username" -P "Password" -i "%%~G" || exit /B
)

推荐阅读