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 VIEW SERVER PERFORMANCE STATE behörighet 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)