Estou usando um aplicativo da Web PHP para interagir com um banco de dados e preciso capturar uma consulta incorreta. É um SQL gerado dinamicamente e não conheço 100% do código nem o escrevi, então preciso ver o que está fazendo.
Usando o SQL Server Management Studio 2008, achei incrivelmente difícil encontrar as últimas n consultas executadas no banco de dados. Pesquisei muito, mas todas as soluções que vi exigem "sql_handle", que é um recurso não disponível no nível de compatibilidade do meu banco de dados e, para inicializar, todas as soluções que vi não parecem capturar consultas dinâmicas, o que usos de aplicativos da web.
Eu estava usando esta consulta:
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
Mas requer inaceitavelmente alterar sp_dbcmptlevel no SQL Server 2005 (a pesquisa requer comptlevel em 90, preciso dele em 80) e, em um caso recente, nem retorna nenhuma consulta dinâmica executada no banco de dados; está apenas retornando as ações dos procedimentos armazenados.
Uma solução semelhante com os mesmos problemas de compatibilidade e resultados incompletos é:
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
Este retorna um subconjunto muito pequeno e estranho de consultas, incluindo a consulta mais recente (geralmente ela mesma) e um monte de create procedure
declarações.
Existe algum recurso do SSMS ou consulta de banco de dados do sistema que me permita visualizar ou capturar consultas recentes? Se eu tiver que capturar e salvar as strings de consulta de alguma forma, isso é aceitável, pois isso é apenas em um sistema de teste.
O SQL Server Profiler foi projetado para fazer isso .
Com ele você pode:
Se você obtiver o SPID que está executando as consultas, isso fornecerá a última instrução executada: