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
相关产品推荐
相关产品推荐

