Udostępnij za pomocą


sys.dm_exec_sql_text (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Zwraca tekst partii SQL zidentyfikowanej przez określony sql_handle. Ta funkcja tabelowa zastępuje funkcję systemową fn_get_sql.

Składnia

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Arguments

sql_handle
To token, który jednoznacznie identyfikuje partię, która wykonała lub jest obecnie wykonywana. sql_handle jest warbinary(64).

sql_handle można uzyskać z następujących dynamicznych obiektów zarządzania:

plan_handle
Jest tokenem, który jednoznacznie identyfikuje plan wykonania zapytań dla partii, która została wykonana, a jej plan znajduje się w pamięci podręcznej planu lub jest obecnie wykonywana. plan_handle jest varbinary(64).

Plan_handle można uzyskać z następujących dynamicznych obiektów zarządzania:

Zwracana tabela

Nazwa kolumny Typ danych Description
dbid smallint ID bazy danych.

Dla statycznego SQL w procedurze przechowywanej, identyfikator bazy danych zawierającej procedurę przechowywaną. Wartość null w przeciwnym razie.
objectid (identyfikator obiektu) int Identyfikator obiektu.

Czy jest NULL dla ad hoc i przygotowanych instrukcji SQL.
number smallint Dla numerowanej procedury przechowywanej, ta kolumna zwraca numer zapisanej procedury. Więcej informacji można znaleźć w sys.numbered_procedures (Transact-SQL).

Czy jest NULL dla ad hoc i przygotowanych instrukcji SQL.
Szyfrowane bit 1 = tekst SQL jest szyfrowany.

0 = tekst SQL nie jest szyfrowany.
tekst nvarchar(max) Tekst zapytania SQL.

Czy jest NULL dla zaszyfrowanych obiektów.

Permissions

Wymaga VIEW SERVER STATE uprawnień na serwerze.

Uprawnienia dla programu SQL Server 2022 i nowszych

Wymaga uprawnienia WYŚWIETL STAN WYDAJNOŚCI SERWERA na serwerze.

Uwagi

W przypadku zapytań ad hoc uchwyty SQL to wartości skrótu oparte na tekstach SQL przesyłanych na serwer i mogą pochodzić z dowolnej bazy danych.

Dla obiektów bazy danych, takich jak procedury przechowywane, wyzwalacze lub funkcje, uchwyty SQL są wyprowadzane z identyfikatora bazy danych, identyfikatora obiektu i numeru obiektu.

Uchwyt planu to wartość skrótu pochodząca z skompilowanego planu całej partii.

Uwaga / Notatka

Dbid nie może być określony na podstawie sql_handle dla zapytań ad hoc. Aby określić dbid dla zapytań ad hoc, użyj plan_handle zamiast tego.

Przykłady

A. Przykład koncepcyjny

Poniżej znajduje się podstawowy przykład ilustrujący przekazanie sql_handle bezpośrednio lub za pomocą CROSS APPLY.

  1. Twórz aktywność.
    Wykonaj następujące T-SQL w nowym oknie zapytań w SQL Server Management Studio.

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. Używam CROSS APPLY.
    sql_handle z sys.dm_exec_requests zostanie przekazany do sys.dm_exec_sql_text za pomocą CROSS APPLY. Otwórz nowe okno zapytania i przekaż spid zidentyfikowany w kroku 1. W tym przykładzie spid jest .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. Przekazując sql_handle bezpośrednio.
    Zdobądź sql_handle od sys.dm_exec_requests. Następnie przekaż sql_handle bezpośrednio do sys.dm_exec_sql_text. Otwórz nowe okno zapytania i przekaż spid zidentyfikowany w kroku 1 do sys.dm_exec_requests. W tym przykładzie spid jest .59 Następnie przekazać zwrócone sql_handle jako argument do 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. Uzyskaj informacje o pięciu najczęściej zapytanych według średniego czasu CPU

Poniższy przykład zwraca tekst instrukcji SQL oraz średni czas CPU dla pięciu najczęstszych zapytań.

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. Dostarcz statystyki wykonania wsadowego

Poniższy przykład zwraca tekst zapytań SQL wykonywanych w partiach i dostarcza informacji statystycznych na ich temat.

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;  

Zobacz także

Dynamiczne widoki zarządzania i funkcje (Transact-SQL)
Dynamiczne widoki zarządzania i funkcje związane z wykonywaniem (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)
Używając APPLY
sys.dm_exec_text_query_plan (Transact-SQL)