0

我在 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%

我需要这个程序非常健壮。它必须每天针对大量文件和表运行。如果它失败了,我需要抓住它并通知系统管理员。现在,抓住它。

因此,为了测试这一点,我尝试了以下测试:

1)将文件重命名为不存在的文件。结果:它返回并且错误级别为 1(即它捕获了错误!)太棒了!

2)在sql程序的前面输入一些语法垃圾。结果:它在日志文件中打印错误消息,但它没有返回错误(因此 %ERRORLEVEL% 中的返回值为零。这对我来说似乎令人难以置信。我错过了什么?

4

1 回答 1

1

尝试使用-bsqlcmd 选项:

-b

指定 sqlcmd 在发生错误时退出并返回 DOS ERRORLEVEL 值。当 SQL Server 错误消息的严重级别大于 10 时,返回给 DOS ERRORLEVEL 变量的值为 1;否则返回值为 0。如果除了 -b 之外还设置了 -V 选项,如果严重级别低于使用 -V 设置的值,则 sqlcmd 不会报告错误。命令提示符批处理文件可以测试 ERRORLEVEL 的值并适当地处理错误。sqlcmd 不报告严重级别为 10 的错误(信息性消息)。

如果 sqlcmd 脚本包含不正确的注释、语法错误或缺少脚本变量,则返回的 ERRORLEVEL 为 1。

这是文档

于 2013-03-22T15:47:11.533 回答