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

SQL Profiler中sp_execute后数字含义及对应执行SQL查看方法

SQL Server中sp_execute相关问题解答

使用SQL Server Profiler做跟踪时,经常会捕获到格式类似下方的执行语句:

exec sp_execute 38,@maxChangeTrackingNumberPublishedApplication=7400,@maxChangeTrackingNumberInstalledApplication=7400

1. sp_execute后跟随数字的含义

该数字是预编译语句的整型句柄(Handle),是SQL Server为预编译SQL分配的唯一标识,对应sp_prepare、sp_prepexec等预编译接口返回的句柄参数。
很多场景下Profiler跟踪里找不到对应sp_prepare记录是正常现象:部分客户端驱动、ORM框架会采用隐式预编译、连接复用机制,预编译动作可能发生在跟踪启动前,或是对应RPC调用未被选中的跟踪事件捕获,并不代表语句没有走预编译流程。

2. 获取sp_execute实际执行SQL内容的方法

跟踪阶段直接捕获完整内容

如果需要在Profiler/SQL Trace中直接匹配句柄对应的SQL,除了常规的语句完成类事件,需要额外勾选两类事件:

  • ExistingConnection(会话类事件):会返回连接建立阶段完成的所有预编译操作记录,很多长连接的预编译动作在连接初始化时就已完成
  • SP:CacheInsert(存储过程类事件):会捕获所有写入执行计划缓存的预编译语句,记录中直接包含句柄编号与对应SQL文本
    如果使用扩展事件(XEvent)做跟踪,捕获rpc_completed事件时勾选statement字段,SQL Server 2012及以上版本会自动解析sp_execute对应的完整SQL,无需手动匹配句柄。

查询系统视图获取当前缓存的所有预编译语句

可以直接执行如下SQL,查询当前实例内存计划缓存中留存的所有预编译句柄、对应SQL文本、执行次数等信息:

SELECT 
    st.text AS 对应预编译SQL文本,
    cp.usecounts AS 历史执行次数,
    cp.size_in_bytes AS 缓存占用大小,
    qp.query_plan AS 执行计划
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
WHERE cp.objtype = 'Prepared'
-- 如需定位特定语句(比如示例中带变更跟踪参数的语句),可追加筛选条件
-- AND st.text LIKE '%@maxChangeTrackingNumberPublishedApplication%'

注意:该视图仅能查询当前仍留存于内存缓存中的预编译语句,如果对应连接已断开、或缓存因内存压力被淘汰,就无法通过该方法查询到历史句柄对应的SQL。

实时复现场景快速获取

如果问题可以稳定复现,在Profiler中额外勾选SP:StmtCompleted事件,执行sp_execute时会直接输出完整的执行语句,无需手动匹配句柄。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:15:24