长存储过程在某些 exec 之后停止返回结果,为啥?
Posted
技术标签:
【中文标题】长存储过程在某些 exec 之后停止返回结果,为啥?【英文标题】:A long stored procedure stops returning results after some execs, why?长存储过程在某些 exec 之后停止返回结果,为什么? 【发布时间】:2011-01-26 14:54:52 【问题描述】:嗨 我有一个长存储过程,用于在我的 asp.net(c#) 应用程序和另一个控制台应用程序(c#) 中填充 GridView。每次我在管理工作室上运行这个 sp 时它都能正常工作。有时这个 sp 停止向应用程序返回值(但同时从管理工作室执行时工作正常)。为什么或如何会发生这种情况? (我使用的是 ms sql 2005 和 win server 2003) 谢谢
【问题讨论】:
【参考方案1】:您没有提供太多详细信息,但我猜您遇到了超时错误,并且您遇到了参数嗅探问题(在 SSMS 中运行良好但不是从应用程序中运行通常对此有点不利。)
下次出现问题时,如果它无法在您的应用程序中运行,但在 SSMS 中运行良好,请使用以下查询来检索两个计划并进行比较。
Use YourDatabase;
SELECT *
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
cross APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
where sys.dm_exec_sql_text.objectid=object_id('YourProcName')
and attribute='set_options'
【讨论】:
我忘了提到,如果我只做一个 alter proc_name 而不对 sp 做任何更改,问题就解决了。你是对的,它正在超时 更改过程将放弃执行计划,从而再次将参数嗅探指示为故障。以上是关于长存储过程在某些 exec 之后停止返回结果,为啥?的主要内容,如果未能解决你的问题,请参考以下文章