Partager via


sys.dm_exec_sql_text (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance

Retourne le texte du lot SQL identifié par le sql_handle spécifié. Cette fonction table remplace la fonction système fn_get_sql.

Syntaxe

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Arguments

sql_handle
Jeton qui identifie de façon unique un lot qui a été exécuté ou est en cours d’exécution. sql_handle est varbinary(64).

Les sql_handle peuvent être obtenues à partir des objets de gestion dynamique suivants :

plan_handle
Est un jeton qui identifie de façon univoque un plan d'exécution de requête pour un lot exécuté ; ce plan réside dans la mémoire cache des plans ou est en cours d’exécution. plan_handle est varbinary(64).

Le plan_handle peut être obtenu à partir des objets de gestion dynamiques suivants :

Table retournée

Nom de la colonne Type de données Description
dbid smallint ID de la base de données.

Pour sql statique dans une procédure stockée, ID de la base de données contenant la procédure stockée. Sinon, Null.
objectid int ID de l’objet.

Est NULL pour les instructions SQL ad hoc et préparées.
nombre smallint Pour une procédure stockée numérotée, cette colonne retourne le numéro de la procédure stockée. Pour plus d’informations, consultez sys.numbered_procedures (Transact-SQL).

Est NULL pour les instructions SQL ad hoc et préparées.
chiffré bit 1 = le texte SQL est chiffré.

0 = le texte SQL n'est pas chiffré.
texte nvarchar(max) Texte de la requête SQL.

NULL pour les objets chiffrés.

autorisations

Nécessite l'autorisation VIEW SERVER STATE sur le serveur.

Autorisations pour SQL Server 2022 (et versions plus récentes)

Nécessite l’autorisation VIEW SERVER PERFORMANCE STATE sur le serveur.

Notes

Pour les requêtes ad hoc, les handles SQL sont des valeurs de hachage basées sur le texte SQL soumis au serveur et peuvent provenir de n’importe quelle base de données.

Pour des objets de base de données tels que des procédures stockées, des déclencheurs ou des fonctions, les handles SQL sont dérivés de l'ID de la base de données, de l'ID de l'objet et du numéro de l'objet.

Le handle de plan est une valeur de hachage dérivée du plan compilé de l’ensemble du lot.

Remarque

dbid ne peut pas être déterminé à partir de sql_handle pour les requêtes ad hoc. Pour déterminer dbid pour les requêtes ad hoc, utilisez plan_handle à la place.

Exemples

R. Exemple conceptuel

Voici un exemple de base pour illustrer la transmission d’un sql_handle directement ou avec CROSS APPLY.

  1. Créez une activité.
    Exécutez la commande T-SQL suivante dans une nouvelle fenêtre de requête dans SQL Server Management Studio.

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. Utilisation de CROSS APPLY.
    Les sql_handle de sys.dm_exec_requests seront passées à sys.dm_exec_sql_text à l’aide de CROSS APPLY. Ouvrez une nouvelle fenêtre de requête et transmettez le spid identifié à l’étape 1. Dans cet exemple, le spid se trouve 59.

    SELECT t.*
    FROM sys.dm_exec_requests AS r
    CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
    WHERE session_id = 59 -- modify this value with your actual spid
    
  3. Passage sql_handle directement.
    Acquérir le sql_handle à partir de sys.dm_exec_requests. Ensuite, passez le sql_handle directement à sys.dm_exec_sql_text. Ouvrez une nouvelle fenêtre de requête et transmettez le spid identifié à l’étape 1 pour sys.dm_exec_requests. Dans cet exemple, le spid se trouve 59. Passez ensuite le sql_handle retourné en tant qu’argument à sys.dm_exec_sql_text.

    -- acquire sql_handle
    SELECT sql_handle FROM sys.dm_exec_requests WHERE session_id = 59  -- modify this value with your actual spid
    
    -- pass sql_handle to sys.dm_exec_sql_text
    SELECT * FROM sys.dm_exec_sql_text(0x01000600B74C2A1300D2582A2100000000000000000000000000000000000000000000000000000000000000) -- modify this value with your actual sql_handle
    

B. Obtenir des informations sur les cinq premières requêtes par temps processeur moyen

L'exemple suivant retourne le texte de l'instruction SQL et le temps processeur moyen pour les cinq premières requêtes.

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],  
    SUBSTRING(st.text, (qs.statement_start_offset/2)+1,   
        ((CASE qs.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_query_stats AS qs  
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st  
ORDER BY total_worker_time/execution_count DESC;  

C. Fournir des statistiques d’exécution par lots

L'exemple suivant retourne le texte des requêtes SQL qui sont exécutées par traitements et fournit des informations statistiques à leur sujet.

SELECT s2.dbid,   
    s1.sql_handle,    
    (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,  
    execution_count,   
    plan_generation_num,   
    last_execution_time,     
    total_worker_time,   
    last_worker_time,   
    min_worker_time,   
    max_worker_time,  
    total_physical_reads,   
    last_physical_reads,   
    min_physical_reads,    
    max_physical_reads,    
    total_logical_writes,   
    last_logical_writes,   
    min_logical_writes,   
    max_logical_writes    
FROM sys.dm_exec_query_stats AS s1   
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2    
WHERE s2.objectid is null   
ORDER BY s1.sql_handle, s1.statement_start_offset, s1.statement_end_offset;  

Voir aussi

Fonctions et vues de gestion dynamique (Transact-SQL)
Fonctions et vues de gestion dynamique relatives à l'exécution (Transact-SQL)
sys.dm_exec_query_stats (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sys.dm_exec_cursors (Transact-SQL)
sys.dm_exec_xml_handles (Transact-SQL)
sys.dm_exec_query_memory_grants (Transact-SQL)
Utilisation de APPLY
sys.dm_exec_text_query_plan (Transact-SQL)