长存储过程在某些 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 之后停止返回结果,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

C# 存储过程 如何返回 tatatable

为啥我的 SQL 存储过程在没有结果时会报错?

如何返回sqlserver 中存储过程的select的结果集

mssql 里面存储过程插入了条数据之后的返回

为啥调用存储过程不返回任何东西?

oracle如何执行存储过程以及如何返回一个table