我正在使用PHP应用程序与数据库交互,需要捕获一个错误的查询。它是动态生成的SQL,我不知道100%的代码,也不编写它,所以我需要看看它在做什么。
使用2008,我发现很难在数据库上找到最后n个执行的查询。我已经搜索了一场风暴,但是我看到的所有解决方案都需要"sql_handle“,这是我的数据库的兼容性级别中无法使用的特性,而且为了引导我看到的所有解决方案,似乎没有捕捉到这个web应用程序使用的动态查询。
我正在使用以下查询:
SELECT TOP 50 * FROM(SELECT COALESCE(OBJECT_NAME(s2.objectid),'Ad-Hoc') AS ProcName,
execution_count,s2.objectid,
(SELECT TOP 1 SUBSTRING(s2.TEXT,statement_start_offset / 2+1 ,
( (CASE WHEN statement_end_offset = -1
THEN (LEN(CONVERT(NVARCHAR(MAX),s2.TEXT)) * 2)
ELSE statement_end_offset END)- statement_start_offset) / 2+1)) AS sql_statement,
last_execution_time
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2 ) x
WHERE sql_statement NOT like 'SELECT TOP 50 * FROM(SELECT %'
ORDER BY last_execution_time DESC
但是,它不能接受地要求在Server 2005中更改sp_dbcmptlevel (搜索要求comptlevel在90,我需要在80),而且在最近的一个例子中,甚至不返回任何运行在数据库上的动态查询;它只是返回存储过程的操作。
具有相同的可压缩性和不完全结果问题的类似解决方案是:
SELECT deqs.last_execution_time AS [Time], dest.TEXT AS [Query]
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY deqs.last_execution_time DESC
这个查询返回一个非常小且非常奇怪的查询子集,包括最近的查询(通常本身)和一组create procedure
语句。
是否有任何SSMS或系统数据库查询功能允许我查看或捕获最近的查询?如果我必须以某种方式捕获和保存查询字符串,这是可以接受的,因为这只是在测试系统中。
发布于 2011-09-16 20:55:03
服务器事件探查器 就是为了做到这一点.
有了它,你可以:
发布于 2011-09-16 21:00:00
如果获得运行查询的SPID,这将为您提供最后一个运行语句:
DECLARE @sqltext VARBINARY(128)
SELECT @sqltext = sql_handle
FROM sys.sysprocesses
WHERE spid = 85 --replace this with your SPID
SELECT TEXT
FROM sys.dm_exec_sql_text(@sqltext)
https://dba.stackexchange.com/questions/5881
复制相似问题