我正在使用 PHP Web 应用程序与数据库交互,需要捕获错误查询。它是动态生成的 SQL,我不知道 100% 的代码,也不是我编写的,所以我需要看看它在做什么。
使用 SQL Server Management Studio 2008,我发现很难找到数据库中最后执行的 n 个查询。我搜索了一场风暴,但我见过的所有解决方案都需要“sql_handle”,这是我数据库兼容级别中不可用的功能,并且启动我见过的所有解决方案似乎都没有捕获动态查询,这网络应用程序使用。
我正在使用这个查询:
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
但它要求在 SQL 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 或系统数据库查询是否有任何功能可以让我查看或捕获最近的查询?如果我必须以某种方式捕获和保存查询字符串,那是可以接受的,因为这仅在测试系统中。
SQL Server Profiler 就是为此而设计的。
有了它,您可以:
如果您获得运行查询的 SPID,这将为您提供最后运行的语句: