sys.dm_exec_sql_text (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Returnerar texten från SQL-batchen som identifieras av den angivna sql_handle. Denna tabellvärda funktion ersätter systemfunktionen fn_get_sql.

Syntax

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Arguments

sql_handle
Är en token som unikt identifierar en batch som har exekverats eller för närvarande körs. sql_handle är varbinär(64).

sql_handle kan erhållas från följande dynamiska hanteringsobjekt:

plan_handle
Är en token som unikt identifierar en frågeexekveringsplan för en batch som har körts och vars plan finns i plancachen, eller för närvarande körs. plan_handle är varbinary(64).

Plan_handle kan hämtas från följande dynamiska hanteringsobjekt:

Tabell returnerad

Kolumnnamn Datatyp Description
dbid smallint ID på databasen.

För statisk SQL i en lagrad procuredo är ID:t för databasen som innehåller den lagrade proceduren. Null annars.
Objekt-ID int Föremålets ID.

Är NULL för ad hoc- och förberedda SQL-satser.
number smallint För en numrerad lagrad procedur returnerar denna kolumn numret för den lagrade proceduren. För mer information, se sys.numbered_procedures (Transact-SQL).

Är NULL för ad hoc- och förberedda SQL-satser.
krypterade bit 1 = SQL-text är krypterad.

0 = SQL-text är inte krypterad.
text nvarchar(max) Text av SQL-frågan.

Är NULL för krypterade objekt.

Permissions

Kräver VIEW SERVER STATE behörighet på servern.

Behörigheter för SQL Server 2022 och senare

Kräver BEHÖRIGHET FÖR VISNINGSSERVERNS PRESTANDATILLSTÅND på servern.

Anmärkningar

För ad hoc-frågor är SQL-handtagen hashvärden baserade på SQL-texten som skickas till servern, och kan komma från vilken databas som helst.

För databasobjekt såsom lagrade procedurer, triggers eller funktioner härleds SQL-handtagen från databasens ID, objekt-ID och objektnummer.

Planhandtag är ett hashvärde som härleds från den kompilerade planen för hela batchen.

Anmärkning

dbid kan inte bestämmas utifrån sql_handle för ad hoc-frågor. För att bestämma dbid för ad hoc-frågor, använd istället plan_handle .

Examples

A. Konceptuellt exempel

Följande är ett grundläggande exempel för att illustrera att man kan klara en sql_handle antingen direkt eller med CROSS APPLY.

  1. Skapa aktivitet.
    Exekvera följande T-SQL i ett nytt frågefönster i SQL Server Management Studio.

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. Använder CROSS APPLY.
    sql_handle från sys.dm_exec_requests kommer att skickas till sys.dm_exec_sql_text med hjälp av CROSS APPLY. Öppna ett nytt frågefönster och skicka den spid som identifierades i steg 1. I detta exempel råkar spiden vara 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. Att skicka sql_handle direkt.
    Skaffa sql_handle från sys.dm_exec_requests. Skicka sedan sql_handle direkt till sys.dm_exec_sql_text. Öppna ett nytt frågefönster och skicka spiden som identifierades i steg 1 till sys.dm_exec_requests. I detta exempel råkar spiden vara 59. Sedan skickar du tillbaka sql_handle som argument till 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. Få information om de fem vanligaste frågorna efter genomsnittlig CPU-tid

Följande exempel returnerar texten till SQL-satsen och genomsnittlig CPU-tid för de fem vanligaste frågorna.

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. Tillhandahålla statistik för batchexekvering

Följande exempel returnerar texten från SQL-frågor som körs i batchar och ger statistisk information om dem.

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;  

Se även

Vyer och funktioner för dynamisk hantering (Transact-SQL)
Körningsrelaterade vyer och funktioner för dynamisk hantering (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)
Använder APPLY
sys.dm_exec_text_query_plan (Transact-SQL)