我在Windows服务器企业系统SP2上运行DOS 6.0.6002。 SQL Server 2008 R2(10.50.4000) 我在DOS中有一个主控制程序。 我正在通过sqlcmd调用一个sql程序。 简化版本如下所示:
set sqlsvr=myServer
set logfile=logfile.txt
sqlcmd -S %sqlsvr% -d myDB -i import_some_stuff.sql > "%logfile%" 2>&1
echo error level = %ERRORLEVEL%
我需要这个程序非常健壮。它必须每天对很多文件和表格运行。如果失败,我需要捕获它并通知sysadmin。现在,抓住它。
为了测试这个,我尝试了以下测试:
1)将文件重命名为不存在的文件。 结果:它返回并且errorlevel为1(即它捕获了错误!)bravo!
2)在sql程序的前面键入一些语法垃圾。 结果:它在日志文件中打印错误消息,但它不会返回错误(因此%ERRORLEVEL%中的返回值为零。这对我来说似乎不可思议。我缺少什么?
答案 0 :(得分:1)
尝试使用sqlcmd的-b
选项:
<强> -b 强>
指定sqlcmd在退出时退出并返回DOS ERRORLEVEL值 发生错误。 返回到DOS ERRORLEVEL的值 当SQL Server错误消息具有严重性级别时,变量为1 大于10;否则,返回的值为0.如果是-V选项 除了-b之外还设置了sqlcmd,如果是,则不会报告错误 严重性级别低于使用-V设置的值。命令提示符 批处理文件可以测试ERRORLEVEL的值并处理错误 适当。 sqlcmd不报告严重性级别10的错误 (信息性消息)。
如果sqlcmd脚本包含错误的注释,则语法错误, 或者缺少脚本变量,返回的ERRORLEVEL为1。