【发布时间】: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