sys.dm_exec_sql_text (Transact-SQL)

 

CETTE RUBRIQUE S’APPLIQUE À :ouiSQL Server (à partir de la version 2008)ouiAzure SQL DatabasenonAzure SQL Data WarehousenonParallel Data Warehouse

Retourne le texte de l’instruction SQL par lots qui est identifié par l’objet sql_handle. Cette fonction remplace la fonction système fn_get_sql.

  
sys.dm_exec_sql_text(sql_handle | plan_handle)  

sql_handle
Handle SQL du lot à rechercher. sql_handle est varbinary(64). sql_handle peut être obtenu à partir d’objets de gestion dynamique suivants :

plan_handle
Identificateur du plan de requête.

Pour plus d’informations, consultez sys.dm_exec_text_query_plan (Transact-SQL).

Nom de colonneType de donnéesDescription
dbidsmallintID de base de données.

Pour les instructions SQL ad hoc et préparées, l'ID de la base de données où les instructions ont été compilées.
ObjectIDintID d’objet.

Est NULL pour les instructions SQL ad hoc et préparées.
nombresmallintPour 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ébits1 = le texte SQL est chiffré.

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

NULL pour les objets chiffrés.

requièrent l'autorisation VIEW SERVER STATE sur le serveur.

Pour les traitements, les handles SQL sont des valeurs de hachage fondées sur le texte SQL. 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. plan_handle est une valeur de hachage dérivée du plan compilé du lot entier.

A. Exemple conceptuel

Voici un exemple pour illustrer le passage de base un sql_handle directement ou à CROSS APPLY.

  1. Créer l’activité.
    Exécutez le code T-SQL suivant 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. À l’aide de CROSS APPLY.
    La colonne sql_handle de sys.dm_exec_requests est transmis à 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 être 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. En passant sql_handle directement.
    Acquérir les sql_handle de sys.dm_exec_requests. Ensuite, passez le sql_handle directement à sys.dm_exec_sql_text. Ouvrir 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 être 59. Passez ensuite retourné sql_handle 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 requêtes principales 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 de 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;  

Vues de gestion dynamique et fonctions (Transact-SQL)
Fonctions (Transact-SQL) et les vues de gestion dynamique liées à l’exécution
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)
À l’aide d’appliquer

Ajouts de la communauté

AJOUTER
Afficher: