SQL存储过程访问数据库C时出现“No process is on the other end of the pipe”错误
SQL存储过程执行报错排查问题
错误信息
执行存储过程时触发如下错误:
Location: "bpctxt.cpp":129 Expression: m_cCreated < m_cMaxBatches SPID: 63 Process ID: 820 Msg 233, Level 20, State 0, Line 0 A transport-level error has occurred when receiving results from the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
异常现象
- 相同参数直接执行查询无异常,但封装到存储过程中执行则报错
- 存储过程创建于数据库A,访问同服务器的数据库B时运行正常,仅访问数据库C时触发错误
- 其他访问数据库C(包含部分相同表)的存储过程可正常运行
- 使用sa账户或Windows账户执行均会触发相同错误
- 已执行DBCC CheckDB(无报错)、断开重连、重启服务器、
sp_refreshsqlmodule、重建索引、更新统计等操作,问题仍未解决
相关代码
问题存储过程伪代码
CREATE PROCEDURE [dbo].[GetData] @switchCondition NVARCHAR(20) AS BEGIN IF @switchCondition = 'X' select <<set of columns>> from databaseB.<<set of tables & views>> -- 执行正常 ELSE select <<set of columns>> from databaseC.<<set of tables & views>> -- 触发错误 END;
直接执行无异常的代码
DECLARE @switchCondition nvarchar(20)='Y'; IF @switchCondition = 'X' select <<set of columns>> from databaseB.dbo.<<set of tables & views>> -- 执行正常 ELSE select <<set of columns>> from databaseC.dbo.<<set of tables & views>> -- 执行无异常
可能的原因
- 存储过程执行计划异常:存储过程的执行计划因参数嗅探或元数据过期,生成了访问数据库C的错误执行逻辑,比如错误调用批处理资源;而直接执行查询时会生成全新执行计划,避开了该问题。
- 数据库C对象元数据与存储过程缓存不兼容:尽管执行了
sp_refreshsqlmodule,但存储过程引用的数据库C的表/视图可能存在隐藏元数据差异(如列类型长度、计算列定义变更未同步),存储过程缓存的旧元数据与实际对象不匹配,触发传输层错误。 - 结果集格式不匹配:访问数据库C的查询返回结果集,在列数量、数据类型(如隐式转换导致溢出)、行大小上与访问数据库B的结果集存在细微差异,存储过程缓存的结果集定义无法兼容该差异,导致管道连接意外终止。
- SQL Server批处理机制bug:错误信息涉及
bpctxt.cpp:129和m_cCreated < m_cMaxBatches,属于SQL Server内部批处理管理逻辑,可能是特定版本下跨数据库访问时的批处理计数bug,仅在存储过程执行上下文触发。
内容的提问来源于stack exchange,提问作者Arie
相关产品推荐
相关产品推荐

