sys.dm_exec_sql_text (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Gibt den Text des SQL-Batches zurück, der durch die angegebene sql_handle identifiziert wird. Diese Tabellenwertfunktion ersetzt die Systemfunktion fn_get_sql.

Syntax

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Argumente

sql_handle
Ein Token, das einen Batch eindeutig identifiziert, der ausgeführt wurde oder gerade ausgeführt wird. sql_handle ist varbinary(64).

Die sql_handle kann aus den folgenden dynamischen Verwaltungsobjekten abgerufen werden:

plan_handle
Ein Token, das einen Abfrageausführungsplan für einen Batch eindeutig identifiziert, der ausgeführt wurde und dessen Plan sich im Plancache befindet, oder der derzeit ausgeführt wird. plan_handle ist varbinary(64)

plan_handle kann aus den folgenden dynamischen Verwaltungsobjekten abgerufen werden:

Zurückgegebene Tabelle

Spaltenname Datentyp BESCHREIBUNG
dbid smallint ID der Datenbank.

Bei statischem SQL in einer gespeicherten Prozedur die ID der Datenbank, die die gespeicherte Prozedur enthält. Andernfalls NULL.
objectid int ID des Objekts.

Dieser Wert ist für Ad-hoc-Anweisungen und vorbereitete SQL-Anweisungen NULL.
Zahl smallint Für eine nummerierte gespeicherte Prozedur gibt diese Spalte die Nummer der gespeicherten Prozedur zurück. Weitere Informationen finden Sie unter sys.numbered_procedures (Transact-SQL).

Dieser Wert ist für Ad-hoc-Anweisungen und vorbereitete SQL-Anweisungen NULL.
encrypted bit 1 = Der SQL-Text ist verschlüsselt.

0 = Der SQL-Text ist nicht verschlüsselt.
text nvarchar(max) Text der SQL-Abfrage.

Der Wert ist für verschlüsselte Objekte NULL.

Berechtigungen

Erfordert die VIEW SERVER STATE-Berechtigung auf dem Server.

Berechtigungen für SQL Server 2022 und höher

Erfordert die VIEW SERVER PERFORMANCE STATE-Berechtigung auf dem Server.

Bemerkungen

Bei Ad-hoc-Abfragen sind die SQL-Handles Hashwerte, die auf dem SQL-Text basieren, der an den Server übermittelt wird, und können aus einer beliebigen Datenbank stammen.

Für Datenbankobjekte, z. B. gespeicherte Prozeduren, Trigger oder Funktionen, werden die SQL-Handles von der Datenbank-ID, Objekt-ID und Objektnummer abgeleitet.

Planhandle ist ein Hashwert, der vom kompilierten Plan des gesamten Batches abgeleitet wird.

Hinweis

dbid kann nicht aus sql_handle für Ad-hoc-Abfragen bestimmt werden. Verwenden Sie zum Bestimmen von dbid für Ad-hoc-Abfragen stattdessen plan_handle .

Beispiele

A. Konzeptionelles Beispiel

Im Folgenden finden Sie ein einfaches Beispiel, um das Übergeben eines sql_handle entweder direkt oder mit CROSS APPLY zu veranschaulichen.

  1. Erstellen Sie die Aktivität.
    Führen Sie die folgende T-SQL-Datei in einem neuen Abfragefenster in SQL Server Management Studio aus.

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. Verwenden von CROSS APPLY.
    Die sql_handle aus sys.dm_exec_requests wird mithilfe von CROSS APPLY an sys.dm_exec_sql_text übergeben. Öffnen Sie ein neues Abfragefenster, und übergeben Sie den in Schritt 1 identifizierten Spid. In diesem Beispiel ist 59der Spid .

    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. Direktes Übergeben von sql_handle .
    Rufen Sie die sql_handle von sys.dm_exec_requests ab. Übergeben Sie dann die sql_handle direkt an sys.dm_exec_sql_text. Öffnen Sie ein neues Abfragefenster, und übergeben Sie den in Schritt 1 identifizierten Spid an sys.dm_exec_requests. In diesem Beispiel ist 59der Spid . Übergeben Sie dann die zurückgegebene sql_handle als Argument an 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. Abrufen von Informationen zu den fünf abfragen nach durchschnittlicher CPU-Zeit

Im folgenden Beispiel wird der Text der SQL-Anweisung und die durchschnittliche CPU-Zeit für die fünf Abfragen mit der höchsten durchschnittlichen CPU-Zeit zurückgegeben.

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. Bereitstellen von Batchausführungsstatistiken

Im folgenden Beispiel wird der Text von SQL-Abfragen zurückgegeben, die in Batches ausgeführt werden. Außerdem werden statistische Informationen zu den Abfragen bereitgestellt.

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;  

Siehe auch

Dynamische Verwaltungssichten und Funktionen (Transact-SQL)
Dynamische Verwaltungssichten und -funktionen im Zusammenhang mit der Ausführung (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)
Verwenden von APPLYsys.dm_exec_text_query_plan (Transact-SQL)