如何从系统表获取用户最后一次执行的语句

pbsh 2009-11-05 11:13:14
有没有方法不通过Profiler,直接从系统表中查询出当前用户所执行的最后一条语句?
...全文
107 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
urdoom 2009-11-05
  • 打赏
  • 举报
回复

select 1

select * from sys.dm_exec_requests


select * from sys.dm_exec_query_stats


select text from sys.dm_exec_sql_text((select sql_handle from sys.dm_exec_query_stats
where statement_end_offset = (select MAX(statement_end_offset) from sys.dm_exec_query_stats)))


你用这段试试看出来什么?

sys.dm_exec_sql_text的参数是sql_handle
而sys.dm_exec_query_stats中存储的sql_handle是一个query的

也就是SSMS中一个查询页里的所有语句共享一个sql_handle

中间的语句分不开的
pbsh 2009-11-05
  • 打赏
  • 举报
回复
拿去最后一条应该更简单才对,通过sys.dm_exec_requests、sys.dm_exec_query_stats和sys.dm_exec_sql_text直接group by取出每个用户最大的statement_end_offset对应语句就行了吧。
urdoom 2009-11-05
  • 打赏
  • 举报
回复
嗯,我也发现问题了,老外那个是用sys.dm_exec_query_stats的execution_count项目倒序抽出

其实不是取得最后执行的sql,而是执行次数最多的sql的倒序集合
pbsh 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fwacky 的回复:]
引用 10 楼 urdoom 的回复:
上面是存储过程,直接用下面这句也可以
SQL codeselecttextfrom sys.dm_exec_sql_text((select sql_handlefrom sys.dm_exec_requestswhere statement_end_offset= (selectMAX(statement_end_offset)from sys.dm_exec_requests)))


你执行完这个命令就会把这条命令自己打出来,呵呵

你那个老外的方法里考虑得比较严密,把自己给排除了



还是有问题!
[/Quote]

说来看看?
fwacky 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 urdoom 的回复:]
上面是存储过程,直接用下面这句也可以
SQL codeselecttextfrom sys.dm_exec_sql_text((select sql_handlefrom sys.dm_exec_requestswhere statement_end_offset= (selectMAX(statement_end_offset)from sys.dm_exec_requests)))


你执行完这个命令就会把这条命令自己打出来,呵呵

你那个老外的方法里考虑得比较严密,把自己给排除了

[/Quote]

还是有问题!
pbsh 2009-11-05
  • 打赏
  • 举报
回复
我觉得方法应该是通过sys.dm_exec_requests找到每一个连接最大的sql_handle,结合上面那一段语句可以得出。
urdoom 2009-11-05
  • 打赏
  • 举报
回复
上面是存储过程,直接用下面这句也可以

select text from sys.dm_exec_sql_text((select sql_handle from sys.dm_exec_requests
where statement_end_offset = (select MAX(statement_end_offset) from sys.dm_exec_requests)))



你执行完这个命令就会把这条命令自己打出来,呵呵

你那个老外的方法里考虑得比较严密,把自己给排除了
pbsh 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 urdoom 的回复:]
引用楼主 pbsh 的回复:
有没有方法不通过Profiler,直接从系统表中查询出当前用户所执行的最后一条语句?


SQL codedeclare@sql_handlevarbinary(64)set@sql_handle= (select sql_handlefrom sys.dm_exec_requestswhere statement_end_offset= (selectMAX(statement_end_offset)from sys.dm_exec_requests))selecttextfrom sys.dm_exec_sql_text(@sql_handle)
[/Quote]

你这个获取的一直都是这句吧。。
fwacky 2009-11-05
  • 打赏
  • 举报
回复
学习,帮顶!@
urdoom 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 pbsh 的回复:]
有没有方法不通过Profiler,直接从系统表中查询出当前用户所执行的最后一条语句?
[/Quote]


declare @sql_handle varbinary(64)

set @sql_handle = (select sql_handle from sys.dm_exec_requests
where statement_end_offset = (select MAX(statement_end_offset) from sys.dm_exec_requests))

select text from sys.dm_exec_sql_text(@sql_handle)
忆轩辕 2009-11-05
  • 打赏
  • 举报
回复
错了,select语句。。。。。。。。等高人出现
忆轩辕 2009-11-05
  • 打赏
  • 举报
回复
log explorer吧
pbsh 2009-11-05
  • 打赏
  • 举报
回复
我在一老外文章中找到部分方法,同大家分享:

SELECT --TOP 100
qs.execution_count,
DatabaseName = DB_NAME(qp.dbid),
ObjectName = OBJECT_NAME(qp.objectid,qp.dbid),
StatementDefinition =
SUBSTRING (
st.text,
(
qs.statement_start_offset / 2
) + 1,
(
(
CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset
) / 2
) + 1
),
query_plan,
st.text, total_elapsed_time
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan (qs.plan_handle) qp
WHERE
st.encrypted = 0
ORDER BY qs.execution_count DESC
xiequan2 2009-11-05
  • 打赏
  • 举报
回复
学习
--小F-- 2009-11-05
  • 打赏
  • 举报
回复
学习
guguda2008 2009-11-05
  • 打赏
  • 举报
回复
似乎要用日志文件吧

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧