如何获取dm_exec_sql_text的参数值

问题描述 投票:10回答:2

我正在运行以下语句,以查看在SQL Server中正在执行哪些查询:

select *
from sys.dm_exec_requests r
cross apply sys.dm_exec_sql_text(r.sql_handle)
where r.database_id = DB_ID('<dbname>')

返回的sql文本已参数化:

(@Parm0 int) select * from foo where foo_id = @Parm0

是否有任何方法可以获取语句所使用的参数的值?通过加入另一个表来说?

sql-server sql-server-2005 sql-server-2008
2个回答
6
投票

编辑:Remus是正确的,这只会在查询计划第一次到达缓存时才带出已编译的版本,而不是随后的运行。

您应该能够从查询计划中获取参数,因为它包含最后使用的参数。更改您的代码:

select * 
from sys.dm_exec_requests r 
cross apply sys.dm_exec_query_plan(plan_handle) as qp
cross apply sys.dm_exec_sql_text(r.sql_handle) 
where r.database_id = DB_ID('<dbname>') 

您会发现查询计划的最后一列是query_plan,您可以手动检查查询计划的xml版本,在XML的底部是参数,或者您是否愿意使用XML解析和XQuery来挑战拔出ParameterList标记


0
投票

一个查询,它提供登录名,执行时间和查询作为最后一个事件的文本,如果您可以帮助连接sys.dm_exec_query_stats,但是它可以工作

SELECT distinct
s.login_name,
qs.creation_time 
,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
  WHEN -1 THEN DATALENGTH(st.text)
  ELSE qs.statement_end_offset END
  - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_sessions S
LEFT JOIN sys.dm_exec_connections AS c ON S.session_id = c.session_id
,sys.dm_exec_query_stats QS --qs on c.most_recent_sql_handle = qs.sql_handle
OUTER APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
WHERE ST.text LIKE '%yourKeyWord%' and s.login_name <> 'NT SERVICE\SQLSERVERAGENT'
order by qs.creation_time desc
© www.soinside.com 2019 - 2024. All rights reserved.