1

运行以下命令时,sqlcmd.exe 将“Timeout Expired”写入控制台,但它返回的退出代码为 0。

sqlcmd.exe -X1 -b -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerThan5Seconds.sql" -E

请注意,我故意将查询超时 -t 设置为 5 秒。另外,我是 -b 参数,我认为应该返回退出代码 1 以显示错误。我也试过 -r1 参数和 -m-1 参数无济于事。

我还查看了故障排除:超时过期文章并注意到它引用了“错误:-2”。所有与错误相关的参数的 sqlcmd.exe 文档似乎只处理大于 0 的错误代码,所以也许“超时过期”不是错误?此外,无论我尝试过什么参数,我都只看到“超时已过期”作为输出,根本没有错误代码。

最后,这是我尝试过的所有命令,仅编辑以保护服务器和数据库名称:

C:\>sqlcmd.exe -X1 -b -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E
Timeout expired

C:\>sqlcmd.exe -X1 -b -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E -r1
Timeout expired

C:\>sqlcmd.exe -X1 -b -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E -V16
Timeout expired

C:\>sqlcmd.exe -X1 -b -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E -m-1
Timeout expired

C:\>sqlcmd.exe -X1 -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E -m-1
Timeout expired

C:\>sqlcmd.exe -X1 -b -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E -r0
Timeout expired

C:\>sqlcmd.exe -X1 -b -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E -o "sqlError.txt"

C:\>notepad sqlError.txt

#REM only "Timeout expired" was written to sqlError.txt

C:\>del sqlError.txt

C:\>sqlcmd.exe -X1 -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E -m-1
Timeout expired

C:\>sqlcmd.exe -X1 -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E -V-3
Sqlcmd: '-V -3': Severity level has to be a number between 1 and 25.

C:\>sqlcmd.exe -X1 -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E -V1
Timeout expired

C:\>sqlcmd.exe -X1 -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerTHan5Seconds.sql" -E -r1
Timeout expired

更新:我应该注意我是通过 Systems.Diagnostics.Process 从 C# 控制台应用程序调用它,所以如果可能的话,我希望 ExitCode 为 1。我不确定是否可以捕获 ERRORLEVEL。

进一步更新:由于某种原因,我的机器正在将 stderr 写入 stdout,因此我无法测试 Stefan M 答案的有效性。我相信他的回答很可能是正确的,因为我以同样的方式解释了 sqlcmd.exe 的文档。我还有另一个问题,为什么我的机器在这里将 stderr 写入 stdout 。

4

1 回答 1

1

不能使用-V-3,最小值是-V1。结合 -b 你应该得到想要的结果。仅当严重性高于 -V 的值时,值“ERRORLEVEL”才会设置为 1。

我最好的猜测是(未经测试):

sqlcmd.exe -X1 -b -S "[ValidServer]" -d "[ValidDatabase]" -t 5 -i "C:\test\ScriptThatRunsLongerThan5Seconds.sql" -E -V1

然后尝试:

echo %ERRORLEVEL%

相关部分是:

当 SQL Server 错误消息的严重级别大于 10 时,返回给 DOS ERRORLEVEL 变量的值为 1;否则返回值为 0。如果除了 -b 还设置了 -V 选项,如果严重级别低于使用 -V 设置的值,则 sqlcmd 不会报告错误

来自http://technet.microsoft.com/en-us/library/ms162773.aspx

-b

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

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

-m 错误级别

控制将哪些错误消息发送到标准输出。发送严重级别大于或等于此级别的消息。当此值设置为 -1 时,将发送包括信息性消息在内的所有消息。-m 和 -1 之间不允许有空格。例如,-m-1 有效,-m -1 无效。

此选项还设置 sqlcmd 脚本变量 SQLCMDERRORLEVEL。此变量的默认值为 0。

-V error_severity_level

控制用于设置 ERRORLEVEL 变量的严重性级别。严重级别大于或等于此值的错误消息设置为 ERRORLEVEL。小于 0 的值报告为 0。批处理和 CMD 文件可用于测试 ERRORLEVEL 变量的值。

于 2013-10-04T13:57:24.310 回答