Je cours la déclaration suivante pour voir quelles requêtes exécutions dans SQL Server:
(@Parm0 int) select * from foo where foo_id = @Parm0
4 Réponses :
Edit: Remus est correct, cela ne fera que ressortir les versions compilées à la première fois que le plan de requête a touché le cache, et non des exécutions ultérieures.
Vous devriez pouvoir obtenir les paramètres du plan de requête, car Il contient les derniers paramètres utilisés. Modifier votre code: p> Vous trouverez la colonne finale du plan de requête est requête_plan, une version XML du plan de requête que vous pouvez inspecter manuellement, au bas de la XML sont les paramètres ou si vous avez envie du défi, utilisez XML analyse et XQuery pour retirer les balises de paramètres de paramètres p> p>
Je pense que ce sont les paramètres reniflés pendant la génération de plan, et non les derniers utilisés.
Votre droite, qui fait de cette jument depuis que je ne vois aucun autre DMV qui donne un enregistrement de la paramétrisation simple / forcée effectuée à la déclaration
WRT "Si vous avez envie du défi, utilisez XML analysant ...", voir Blog Post .
une requête qui donne le nom de connexion, l'heure de l'exécution et la requête en tant que texte des derniers événements, si vous pouvez donner une main à la jointure de sys.dm_exec_query_stats, mais cela fonctionne
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
Je ne sais pas pourquoi cette réponse n'a pas été montrée plus d'amour, il est beaucoup plus proche que la réponse sélectionnée à mon avis - vous pouvez trouver plus facilement les requêtes réellement exécutées.
Si quelqu'un trébuche sur ce fil à la recherche d'une solution appropriée (que les autres réponses malheureusement manquées), j'ai trouvé cela POST utile de MSSQLTIPS .
J'ai nettoyé et a modifié la requête un peu à Faites celui-ci: p> Cela fonctionne assez bien et chaque paramètre aura sa propre ligne. P>
Si vous utilisez une version avant SQL Server 2012 ou Amazon RDS où la fonction Try_Convert n'existe pas, il s'agit d'une variante de la requête Indigo qui fonctionnera.
-- cleanup IF OBJECT_ID('tempdb..#compiledValue') IS NOT NULL DROP TABLE #compiledValue GO -- Prepare temp table #compiledValue SELECT OBJECT_NAME(est.objectid) ObjectName, DB_NAME(est.dbid) DBName, eqs.last_execution_time, est.text, (eqs.statement_start_offset / 2) + 1 AS statement_start_offset, (IIF(eqs.statement_end_offset = -1, DATALENGTH(est.text), eqs.statement_end_offset) - eqs.statement_start_offset) / 2 + 1 AS statement_end_offset, --TRY_CONVERT(XML, -- SUBSTRING(etqp.query_plan, -- CHARINDEX('<ParameterList>',etqp.query_plan), -- CHARINDEX('</ParameterList>',etqp.query_plan) + LEN('</ParameterList>') - CHARINDEX('<ParameterList>',etqp.query_plan) )) AS statement_params, CASE WHEN CHARINDEX('<ParameterList>', etqp.query_plan) > 0 THEN CONVERT(XML, SUBSTRING(etqp.query_plan, CHARINDEX('<ParameterList>', etqp.query_plan), CHARINDEX('</ParameterList>', etqp.query_plan) + LEN('</ParameterList>') - CHARINDEX('<ParameterList>', etqp.query_plan) )) ELSE NULL END AS statement_params INTO #compiledValue FROM sys.dm_exec_query_stats eqs CROSS APPLY sys.dm_exec_sql_text(eqs.sql_handle) est CROSS APPLY sys.dm_exec_text_query_plan(eqs.plan_handle, eqs.statement_start_offset, eqs.statement_end_offset) etqp SELECT cvalue.last_execution_time, cvalue.DBName, cvalue.ObjectName, SUBSTRING(cvalue.text,cvalue.statement_start_offset,cvalue.statement_end_offset) AS sql_text, pc.compiled.value('@Column', 'nvarchar(128)') AS Parameterlist, pc.compiled.value('@ParameterCompiledValue', 'nvarchar(128)') AS [compiled Value] FROM #compiledValue cvalue OUTER APPLY cvalue.statement_params.nodes('//ParameterList/ColumnReference') AS pc(compiled) WHERE cvalue.text NOT LIKE '%#compiledValue%' -- ignore these queries based on temp table name ORDER BY cvalue.last_execution_time DESC GO -- cleanup DROP TABLE #compiledValue GO
Un peu plus de travail pour le sortir de cette façon, mais cela fonctionne si je dois l'avoir. Merci!
Avez-vous déjà découvert une solution à cela? La réponse acceptée ne semble pas fonctionner ...