我有一个存储过程给我一个sqlException,因为我从代码运行它时超时(超时设置为30).当我直接在Management Studio中运行该过程时,它会在1秒内执行.我也只在针对特定数据库运行时获得超时.当我使用其他数据库时,它可以快速完成而不会出现错误.这是完整的错误消息:
System.Data.sqlClient.sqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.sqlClient.sqlConnection.OnError(sqlException exception,Boolean breakConnection) at System.Data.sqlClient.sqlInternalConnection.OnError(sqlException exception,Boolean breakConnection) at System.Data.sqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.sqlClient.TdsParser.Run(RunBehavior runBehavior,sqlCommand cmdHandler,sqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj) at System.Data.sqlClient.sqlDataReader.ConsumeMetaData() at System.Data.sqlClient.sqlDataReader.get_MetaData() at System.Data.sqlClient.sqlCommand.FinishExecuteReader(sqlDataReader ds,RunBehavior runBehavior,String resetOptionsString) at System.Data.sqlClient.sqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,Boolean returnStream,Boolean async) at System.Data.sqlClient.sqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,String method,DbAsyncResult result) at System.Data.sqlClient.sqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,String method) at System.Data.sqlClient.sqlCommand.ExecuteReader(CommandBehavior behavior,String method) at System.Data.sqlClient.sqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
这个堆栈跟踪对任何人都意味着什么?看起来我的sproc可能已经完成了,并且在尝试读取某种元数据时超时了?
我尝试在运行过程中查看该进程并将其暂停. sys.dm_os_waiting_tasks将等待类型显示为IO_COMPLETION,如果有任何用途的话.我在数据库中使用sp_who2’active’看到的唯一进程是一次超时和我的活动SSMS窗口,所以我不认为这是一个阻塞问题.我验证了这个数据库与工作数据库具有相同的权限,并运行dbcc checkdb而没有任何错误.如何确定超时的原因?
解决方法
您可以将超时的会话的SET选项与不是的会话的SET选项进行比较:
SELECT session_id,[ansi_defaults],[ansi_null_dflt_on],[ansi_nulls],[ansi_padding],[ansi_warnings],[arithabort],[concat_null_yields_null],[deadlock_priority],[quoted_identifier],[transaction_isolation_level] FROM sys.dm_exec_sessions WHERE session_id IN (<spid1>,<spid2>);
当您发现一些不同的情况时,请尝试将每个设置更改为SSMS查询中的相反设置,直到获得超时(或在发送查询之前手动设置应用程序代码中的选项).现在,我没有方便的2005实例,所以没有测试过这个查询.您可能需要注释掉一个或多个列名称.