C#应用调用SQL Server存储过程同一会话出现多批次问题问询
结论1:存储过程脚本中的GO不是多批次现象的原因
GO是SQL客户端工具(SSMS、sqlcmd等)专属的批处理分隔符,不属于SQL Server引擎的原生语法,仅用于拆分用户在客户端提交的DDL脚本批次:你贴出的ALTER存储过程脚本中的GO,只会在你本地执行脚本创建/修改存储过程时,把脚本拆分为4个本地提交的批次(切换数据库、设置ANSI_NULLS、设置QUOTED_IDENTIFIER、创建存储过程)。最终存储在SQL Server中的存储过程本体完全不包含这些GO语句,运行存储过程时不会触发额外批次。
结论2:多批次显示是开启MARS后SSMS活动监视器的特性,无实际负面影响
你观察到的同一会话出现3个批次,本质是MARS的实现逻辑和SSMS活动监视器的显示规则共同导致的:
- 开启MARS后,同一个物理
SqlConnection会支持单连接上并发运行多个命令,SQL Server内部会为该连接分配多个独立的逻辑请求上下文来实现这一特性 - SSMS活动监视器会将这些逻辑请求上下文识别为独立的批次条目展示,并非真的执行了3次存储过程
你可以通过扩展事件(Extended Events)或者SQL Server Profiler跟踪实际执行的语句,只会捕获到1次[dbo].[GetLabels]的调用,没有额外执行开销,也不会影响业务逻辑正确性。
处理建议
- 不需要调整现有业务代码,你侧的存储过程调用逻辑没有问题,MARS作为全局配置可以正常保留
- 可以和DBA同步该现象的本质,避免误判为执行异常
内容的提问来源于stack exchange,提问作者Hector Lazarin
相关产品推荐
相关产品推荐

