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在事件捕获逻辑上的不同:
事件类型的精准区分
传统Profiler会把包含exec语句的整个批处理(包括表值参数初始化+sp_executesql调用)统计为一个"存储过程执行";但扩展事件会严格区分:只有直接调用存储过程的rpc_completed事件对应传统的RPC:Completed才会被标记为存储过程执行,而通过sp_executesql包装的调用会被归类为批处理或sp_executesql自身的执行,不会被算成独立的存储过程调用。表值参数的批处理包装
这段缺失的代码本质是通过sp_executesql间接调用BuyRatesListCheapForCons存储过程,外层包含大量表值参数的声明和插入操作。传统Profiler会把整个批处理作为单独条目展示,而扩展事件可能会合并sp_executesql调用与内部实际执行的存储过程事件,只记录实际的存储过程执行,忽略外层的批处理包装。默认跟踪模板的配置差异
XEvent和ADS Profiler的默认模板通常只勾选rpc_completed事件(捕获直接存储过程调用),没有包含sql_batch_completed事件,这就导致外层包含表值参数初始化的批处理不会被捕获,而另外3个直接执行的存储过程会被记录。
- 检查扩展事件会话配置,添加
sql_batch_completed事件后,就能捕获到这段缺失的批处理代码。 - 查看扩展事件中的
module_end或sp_statement_completed事件,可展示更细粒度的执行步骤,包括sp_executesql内部调用的目标存储过程。
内容的提问来源于stack exchange,提问作者barnonline

