11
votes

Comment obtenir des valeurs de paramètre pour dm_exec_sql_text

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


2 commentaires

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 ...


4 Réponses :


7
votes

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: xxx

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


3 commentaires

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 .



2
votes

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


1 commentaires

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.



1
votes

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: xxx

Cela fonctionne assez bien et chaque paramètre aura sa propre ligne.

Par exemple: Capture d'écran du studio de gestion de SQL Server du résultat


0 commentaires

0
votes

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


0 commentaires