You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:45:03