BAT文件中的SQLCMD实用程序 - 如何在语法错误的情况下返回ERRORLEVEL

10
我如何在SQLCMD工具中获取%ERRORLEVEL%,当一些.sql文件包含语法错误时?这些文件创建存储过程。它们不调用"raiseerror",但可能包含语法错误,我需要终止进程。但它总是返回0作为%ERRORLEVEL%。我尝试使用-b、-V和-m(以及它们的组合),但没有符合我的预期工作的结果。
以下是我的批处理文件的代码片段。
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

你需要使用-b开关,但是要和enabledelayedexpansion一起使用,这样你就可以在循环内使用!errorlevel!并获得预期的结果。

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

[我还尝试过使用if not errorlevel 0 …(没有感叹号,也没有任何百分号:请参阅help if),但无法获得预期的结果]


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接