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.
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';
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 trouve59
.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
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 trouve59
. 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)