运行以下命令时,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 。