批处理文件能否处理SQLCMD中:r引用文件不存在的错误?
问题:SQLCMD执行
:r引用不存在的文件时不返回错误码的解决方法 当批处理调用SQLCMD执行包含:r命令的SQL脚本时,即使:r指定的文件不存在,SQLCMD仅打印提示信息但不会返回错误码,导致if errorlevel 1无法检测到错误。现有代码如下:
test.bat:
@echo off sqlcmd -E -S . -V1 -i test.sql if errorlevel 1 goto :handleerror echo All good. goto :eof :handleerror echo An error occurred. goto :eof
test.sql:
:r nonexistent.sql
以下是几种可行的解决思路:
通过输出内容匹配错误关键字
SQLCMD遇到找不到文件的情况会输出Could not find file 'xxx'.的提示,我们可以把输出重定向到日志文件,再检查日志中是否包含该错误字符串:@echo off set "error_log=sql_temp.log" sqlcmd -E -S . -V1 -i test.sql > %error_log% 2>&1 findstr /C:"Could not find file" %error_log% >nul if %errorlevel% equ 0 goto :handleerror echo All good. del %error_log% goto :eof :handleerror echo An error occurred. del %error_log% goto :eof原理是将标准输出和错误输出都写入临时日志,用
findstr查找特定错误内容,匹配成功则触发错误处理逻辑。在SQL脚本中提前检测文件存在性
利用SQLCMD的!!扩展命令执行系统批处理命令,提前检查文件是否存在,不存在则主动返回错误码::setvar target_script "nonexistent.sql" !!if not exist $(target_script) echo File missing: $(target_script) && exit /b 1 :r $(target_script)这里
!!用于调用系统命令,文件不存在时exit /b 1会让系统命令返回错误码,SQLCMD会继承这个错误码,批处理中的if errorlevel 1就能正常捕获到。尝试添加
-b参数强制返回错误码
在SQLCMD调用中加入-b参数(遇到错误立即退出并返回DOS错误码),结合-V1使用:sqlcmd -E -S . -V1 -b -i test.sql注意:该方法的兼容性依赖SQL Server版本,部分旧版本可能仍不会对
:r的文件缺失返回错误码,需要实际测试验证。
内容的提问来源于stack exchange,提问作者uKER
相关产品推荐
相关产品推荐

