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

SQL Server与XEvent Profiler存储过程显示数量不一致原因咨询

问题描述

我有一个执行4个存储过程的会话,SQL Server Profiler中显示了4个,但XEvent Profiler和Azure Data Studio Profiler仅显示3个。以下是在其他分析器中未出现的SQL Server Profiler文本数据:

declare @p3 dbo.PortTableType
insert into @p3
values (N'SEGOT')

declare @p4 dbo.PortTableType
insert into @p4
values (N'CNSHG')

declare @p5 dbo.CommodityTableType
insert into @p5
values (N'FAK')

declare @p6 dbo.ContainerTableType
insert into @p6
values
(N'DV', 40, 1, 1)
insert into @p6
values
(N'HC', 40, 1, 1)

declare @p7 dbo.CarriersTableType
insert into @p7
values (N'CMDU')
insert into @p7
values (N'COSU')
insert into @p7
values (N'EISU')
insert into @p7
values (N'HLCU')
insert into @p7
values (N'MAEU')
insert into @p7
values (N'MSCU')
insert into @p7
values (N'ONEL')
insert into @p7
values (N'OOCL')
insert into @p7
values (N'ZIMU')

declare @p13 dbo.CountriesTableType

declare @p14 dbo.CountriesTableType

declare @p16 dbo.SeaContractTableType

exec sp_executesql N'BuyRatesListCheapForCons @PortsFrom, @PortsTo, @Commodities, @Containers, @Carriers, @Date, @PortFromAlt, @Incoterm, @PortToAlt, @QuoteType, @CountriesFrom, @CountriesTo, @IncludeCosts, @ContractReferences, @CustomerID, @FCLRateLevel, @RequestCurrency 
',
N'@PortsFrom [dbo].[PortTableType] READONLY,@PortsTo [dbo].[PortTableType] READONLY,@Commodities [dbo].[CommodityTableType] READONLY,@Containers [dbo].[ContainerTableType] READONLY,@Carriers [dbo].[CarriersTableType] READONLY,@Date datetime,@PortFromAlt bit,@Incoterm nvarchar(3),@PortToAlt bit,@QuoteType nvarchar(1),@CountriesFrom [dbo].[CountriesTableType] READONLY,@CountriesTo [dbo].[CountriesTableType] READONLY,@IncludeCosts bit,@ContractReferences [dbo].[SeaContractTableType] READONLY,@CustomerID nvarchar(4000),@FCLRateLevel int,@RequestCurrency nvarchar(4000)',
@PortsFrom = @p3,
@PortsTo = @p4,
@Commodities = @p5,
@Containers = @p6,
@Carriers = @p7,
@Date = '2023-03-16 11:14:01.427',
@PortFromAlt = 1,
@Incoterm = N'EXW',
@PortToAlt = 1,
@QuoteType = N'I',
@CountriesFrom = @p13,
@CountriesTo = @p14,
@IncludeCosts = 0,
@ContractReferences = @p16,
@CustomerID = NULL,
@FCLRateLevel = 0,
@RequestCurrency = NULL
原因分析

这个差异核心是传统Profiler与基于扩展事件的XEvent/ADS Profiler在事件捕获逻辑上的不同:

  1. 事件类型的精准区分
    传统Profiler会把包含exec语句的整个批处理(包括表值参数初始化+sp_executesql调用)统计为一个"存储过程执行";但扩展事件会严格区分:只有直接调用存储过程的rpc_completed事件对应传统的RPC:Completed才会被标记为存储过程执行,而通过sp_executesql包装的调用会被归类为批处理或sp_executesql自身的执行,不会被算成独立的存储过程调用。

  2. 表值参数的批处理包装
    这段缺失的代码本质是通过sp_executesql间接调用BuyRatesListCheapForCons存储过程,外层包含大量表值参数的声明和插入操作。传统Profiler会把整个批处理作为单独条目展示,而扩展事件可能会合并sp_executesql调用与内部实际执行的存储过程事件,只记录实际的存储过程执行,忽略外层的批处理包装。

  3. 默认跟踪模板的配置差异
    XEvent和ADS Profiler的默认模板通常只勾选rpc_completed事件(捕获直接存储过程调用),没有包含sql_batch_completed事件,这就导致外层包含表值参数初始化的批处理不会被捕获,而另外3个直接执行的存储过程会被记录。

验证与解决方法
  • 检查扩展事件会话配置,添加sql_batch_completed事件后,就能捕获到这段缺失的批处理代码。
  • 查看扩展事件中的module_end或sp_statement_completed事件,可展示更细粒度的执行步骤,包括sp_executesql内部调用的目标存储过程。

内容的提问来源于stack exchange,提问作者barnonline

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:54:53