如何处理sqlcmd.exe“Timeout expired”消息,这似乎不是错误?

时间:2013-10-04 13:35:27

标签: sql sql-server tsql sqlcmd

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

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

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

我还查看了Troubleshooting: Timeout Expired文章,发现它引用了“错误:-2”。与错误相关的所有参数的sqlcmd.exe文档似乎只处理大于0的错误代码,因此“Timeout expired”可能不是错误?此外,无论我尝试过什么参数,我只看到“Timeout expired”作为输出,根本没有错误代码。

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

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。

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

1 个答案:

答案 0 :(得分: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 error_level

     

控制将哪些错误消息发送到stdout。发送严重性级别大于或等于此级别的邮件。   当此值设置为-1时,所有消息都包含信息   消息,发送。 -m和-1之间不允许有空格。对于   例如,-m-1有效,-m -1不有。

     

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

     

-V error_severity_level

     

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