Sdílet prostřednictvím


sys.dm_exec_sql_text (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Vrátí text SQL dávkové části, která je identifikována zadaným sql_handle. Tato tabulková funkce nahrazuje systémovou funkci fn_get_sql.

Syntaxe

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Arguments

sql_handle
Je token, který jednoznačně identifikuje dávku, která byla vykonána nebo právě probíhá. sql_handle je varbinární(64).

sql_handle lze získat z následujících dynamických řídících objektů:

plan_handle
Je token, který jednoznačně identifikuje plán provedení dotazu pro dávku, která byla vykonána a její plán se nachází v cache plánu, nebo je právě vykonává. plan_handle je varbinary(64).

Plan_handle lze získat z následujících objektů dynamické správy:

Vrácená tabulka

Název sloupce Datový typ Description
dbid smallint ID databáze.

Pro statický SQL v uložené procedurě ID databáze obsahující uloženou proceduru. V opačném případě je null.
ID objektu int ID objektu.

Je NULL pro ad hoc a připravené SQL příkazy.
number smallint Pro číslovanou uloženou proceduru tento sloupec vrací číslo uložené procedury. Pro více informací viz sys.numbered_procedures (Transact-SQL).

Je NULL pro ad hoc a připravené SQL příkazy.
zakódovaný bit 1 = SQL text je šifrován.

0 = SQL text není šifrován.
text nvarchar(max) Text SQL dotazu.

Je NULL pro šifrované objekty.

Povolení

Vyžaduje VIEW SERVER STATE oprávnění na serveru.

Oprávnění pro SQL Server 2022 a novější

Vyžaduje oprávnění ZOBRAZIT STAV VÝKONU SERVERU na serveru.

Poznámky

Pro ad hoc dotazy jsou SQL handles hashovací hodnoty založené na SQL textu odeslaném serveru a mohou pocházet z jakékoli databáze.

U databázových objektů, jako jsou uložené procedury, triggery nebo funkce, jsou SQL handles odvozeny z ID databáze, ID objektu a čísla objektu.

Handle plánu je hash hodnota odvozená z kompilovaného plánu celé dávky.

Poznámka:

Dbid nelze určit z sql_handle pro ad hoc dotazy. Pro určení dbid pro ad hoc dotazy použijte místo toho plan_handle .

Examples

A. Konceptuální příklad

Následuje základní příklad pro ilustraci předání sql_handle buď přímo, nebo pomocí CROSS APPLY.

  1. Vytvářejte aktivitu.
    Spuskutěte následující T-SQL v novém dotazovacím okně v SQL Server Management Studio.

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. Používám CROSS APPLY.
    sql_handle z sys.dm_exec_requests bude předán sys.dm_exec_sql_text pomocí CROSS APPLY. Otevřete nové okno dotazu a pošlete SPID identifikovaný v kroku 1. V tomto příkladu je spid .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. Přímo sql_handle předávám.
    Získejte sql_handle od sys.dm_exec_requests. Pak sql_handle předejte přímo sys.dm_exec_sql_text. Otevřete nové okno dotazu a pošlete spid identifikovaného v kroku 1 na sys.dm_exec_requests. V tomto příkladu je spid .59 Pak vrácený sql_handle předám jako 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. Získejte informace o pěti nejčastějších dotazech podle průměrného času CPU

Následující příklad vrací text SQL příkazu a průměrný čas CPU pro pět nejčastějších dotazů.

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. Poskytnout statistiky dávkového provádění

Následující příklad vrací text SQL dotazů, které jsou prováděny v dávkách, a poskytuje o nich statistické informace.

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;  

Viz také

Zobrazení a funkce dynamické správy (Transact-SQL)
zobrazení a funkce související se spouštěním dynamické správy (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)
Použití APPLY
sys.dm_exec_text_query_plan (Transact-SQL)