Delen via


sys.dm_exec_sql_text (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Geeft de tekst terug van de SQL-batch die is geïdentificeerd door de gespecificeerde sql_handle. Deze tabelwaardige functie vervangt de systeemfunctie fn_get_sql.

Syntaxis

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Arguments

sql_handle
Is een token dat uniek een batch identificeert die heeft uitgevoerd of momenteel uitvoert. sql_handle is varbinair(64).

De sql_handle kan worden verkregen uit de volgende dynamische beheerobjecten:

plan_handle
Is een token dat uniek een query-uitvoeringsplan identificeert voor een batch die is uitgevoerd en waarvan het plan zich in de plancache bevindt, of momenteel uitvoert. plan_handle is varbinair(64).

De plan_handle kan worden verkregen uit de volgende dynamische beheerobjecten:

Tabel geretourneerd

Kolomnaam Gegevenstype Description
dbid smallint ID van database.

Voor statische SQL in een opgeslagen procedure is de ID van de database die de opgeslagen procedure bevat. Anders nietig.
Object int ID van object.

Is NULL voor ad hoc en voorbereide SQL-instructies.
number smallint Voor een genummerde opgeslagen procedure geeft deze kolom het nummer van de opgeslagen procedure terug. Voor meer informatie, zie sys.numbered_procedures (Transact-SQL).

Is NULL voor ad hoc en voorbereide SQL-instructies.
Gecodeerde bit 1 = SQL-tekst is versleuteld.

0 = SQL-tekst is niet versleuteld.
tekst nvarchar(max) Tekst van de SQL-query.

Is NULL voor versleutelde objecten.

Permissions

Hiervoor is machtiging vereist VIEW SERVER STATE op de server.

Machtigingen voor SQL Server 2022 en hoger

Vereist de machtiging PRESTATIESTATUS VAN DE WEERGAVESERVER op de server.

Opmerkingen

Voor ad hoc-queries zijn de SQL-handles hashwaarden gebaseerd op de SQL-tekst die aan de server wordt gestuurd, en kunnen ze afkomstig zijn van elke database.

Voor databaseobjecten zoals opgeslagen procedures, triggers of functies worden de SQL-handles afgeleid van de database-ID, object-ID en objectnummer.

Plan handle is een hashwaarde die wordt afgeleid van het gecompileerde plan van de hele batch.

Opmerking

dbid kan niet worden bepaald uit sql_handle voor ad hoc zoekopdrachten. Om dbid voor ad hoc-queries te bepalen, gebruik plan_handle in plaats daarvan.

Voorbeelden

Eén. Conceptueel voorbeeld

Het volgende is een basisvoorbeeld om te illustreren hoe je een sql_handle direct of met CROSS APPLY kunt halen.

  1. Creëer activiteit.
    Voer de volgende T-SQL uit in een nieuw queryvenster in SQL Server Management Studio.

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. Gebruik CROSS APPLY.
    De sql_handle van sys.dm_exec_requests worden doorgegeven aan sys.dm_exec_sql_text via CROSS APPLY. Open een nieuw queryvenster en geef de spid door die in stap 1 is geïdentificeerd. In dit voorbeeld is 59de spid toevallig .

    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. Geef sql_handle direct door.
    Haal de sql_handle van sys.dm_exec_requests. Geef vervolgens de sql_handle direct aan sys.dm_exec_sql_text. Open een nieuw queryvenster en geef de spid die in stap 1 is geïdentificeerd door aan sys.dm_exec_requests. In dit voorbeeld is 59de spid toevallig . Geef dan de teruggegeven sql_handle als argument aan 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. Verkrijg informatie over de vijf belangrijkste zoekopdrachten op basis van gemiddelde CPU-tijd

Het volgende voorbeeld geeft de tekst van de SQL-instructie en de gemiddelde CPU-tijd voor de top vijf queries terug.

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. Verskaf batch-uitvoeringsstatistieken

Het volgende voorbeeld geeft de tekst van SQL-query's die in batches worden uitgevoerd terug en geeft statistische informatie hierover.

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;  

Zie ook

Dynamische beheerweergaven en -functies (Transact-SQL)
uitvoeringsgerelateerde dynamische beheerweergaven en -functies (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)
APPLY gebruiken
sys.dm_exec_text_query_plan (Transact-SQL)