我尝试使用带有批处理脚本的sqlcmd删除数据库。我遇到的问题是,如果sql中没有mytest数据库,代码就不会进入错误处理程序块。
@echo off
@echo IF ELSE DEMO
sqlcmd -S <servername> -U <username> -P <password> -Q "DROP DATABASE Mytest"
IF ERRORLEVEL 1 goto err_handler
goto done
:err_handler
echo handle the error here
goto end
:done
echo script completion code here
:end
@echo %Message%
pause
并提供以下输出:
IF ELSE DEMO
Msg 3701, Level 11, State 1, Server HERCULES, Line 1
Cannot drop the database 'Mytest', because it does not exist or you do not have permission.
script completion code here
ECHO is off.
Press any key to continue . . .
如果数据库可用,它应该删除数据库并输入:done code如果数据库不可用则应输入:err_handler block。
我不想让Echo离开。
答案 0 :(得分:5)
错误报告选项
<强> -b 强>
指定sqlcmd退出并在何时返回DOS ERRORLEVEL值 发生错误。返回到DOS ERRORLEVEL的值 当SQL Server错误消息具有严重性级别时,变量为1 大于10;否则,返回的值为0.如果是-V选项 除了-b之外还设置了sqlcmd,如果是,则不会报告错误 严重性级别低于使用-V设置的值。命令提示符 批处理文件可以测试ERRORLEVEL的值并处理错误 适当。 sqlcmd不报告严重性级别10的错误 (信息性消息)。
如果sqlcmd脚本包含不正确的注释,语法错误或 缺少脚本变量,返回的ERRORLEVEL为1。
-m error_level
控制将哪些错误消息发送到stdout。有的消息 发送大于或等于此级别的严重性级别。 当此值设置为-1时,所有消息都包含信息 消息,发送。 -m和-1之间不允许有空格。对于 例如,-m-1有效,-m -1不有。
此选项还设置sqlcmd脚本变量SQLCMDERRORLEVEL。 此变量的默认值为0.
-V error_severity_level
控制用于设置ERRORLEVEL的严重性级别 变量。严重性级别大于或的错误消息 等于此值设置ERRORLEVEL。小于0的值是 报告为0.批处理和CMD文件可用于测试值 ERRORLEVEL变量。
您需要使用相应的值来从数据库中获取错误。如果没有它们,您看到的errorlevel
被称为执行的sqlcmd
实例(应该是0
,因为它已成功执行),而不是数据库中运行的命令。
此外,正如已经评论过的那样,ECHO is off.
消息由您的
echo %Message%
变量undefined。该行被解析并转换为
echo
因为%Message%
没有价值。没有参数的echo
命令的行为是输出echo
状态。