【问题标题】:How do I handle sqlcmd.exe "Timeout expired" message, which doesn't appear to be an error?如何处理似乎不是错误的 sqlcmd.exe“超时已过期”消息?
【发布时间】:2013-10-04 13:35:26
【问题描述】:

运行以下命令时,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 参数无济于事。

我还查看了Troubleshooting: Timeout Expired 文章并注意到它引用了“错误:-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 here 的问题。

【问题讨论】:

    标签: sql sql-server tsql sqlcmd


    【解决方案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%
    

    相关部分是:

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

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

    -b

    指定 sqlcmd 在发生错误时退出并返回 DOS ERRORLEVEL 值。返回到 DOS ERRORLEVEL 的值 当 SQL Server 错误消息具有严重性级别时,变量为 1 大于 10;否则,返回值为 0。如果 -V 选项 除了 -b 已经设置了,sqlcmd 不会报错,如果 严重性级别低于使用 -V 设置的值。命令提示符 批处理文件可以测试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 变量。

    【讨论】:

    • 感谢您的回答。你说 -V-3 不正确是对的,我之前的测试没有 -b 和 -V1 的组合。我只是尝试了没有骰子的组合。仍然退出代码 0 和标准输出“超时已过期\r\n”。谢谢你的尝试。
    • ERRORLEVEL 也是空的?
    • 我不确定。我更新了提到我使用 System.Diagnostics.Process 通过 C# 调用 sqlcmd.exe 的问题。
    • 即使在“WaitForExit()”之后,您也可以访问环境变量:p.StartInfo.EnvironmentVariables["ERRORLEVEL"]。此外,从 C# 调用 sqlcmd.exe 是连线的,因为您在 C# 中有一个非常强大的 SQL 库:stackoverflow.com/questions/1449646/…
    • 刚在dos中测试,使用-b和-V1时ERRORLEVEL为0。
    猜你喜欢
    • 2011-01-15
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多