Bagikan melalui


sys.dm_exec_sql_text (Transact-SQL)

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Mengembalikan teks batch SQL yang diidentifikasi oleh sql_handle yang ditentukan. Fungsi bernilai tabel ini menggantikan fungsi sistem fn_get_sql.

Sintaks

sys.dm_exec_sql_text(sql_handle | plan_handle)  

Argumen

sql_handle
Adalah token yang secara unik mengidentifikasi batch yang telah dijalankan atau sedang dijalankan. sql_handle adalah varbinary(64).

sql_handle dapat diperoleh dari objek manajemen dinamis berikut:

plan_handle
Adalah token yang secara unik mengidentifikasi rencana eksekusi kueri untuk batch yang telah dijalankan dan rencananya berada di cache rencana, atau saat ini sedang dijalankan. plan_handle adalah varbinary(64).

plan_handle dapat diperoleh dari objek manajemen dinamis berikut:

Tabel Dikembalikan

Nama kolom Jenis data Deskripsi
dbid smallint ID database.

Untuk SQL statis dalam prosedur tersimpan, ID database yang berisi prosedur tersimpan. Jika tidak, null.
objectid int ID objek.

Adalah NULL untuk pernyataan ad hoc dan SQL yang disiapkan.
number smallint Untuk prosedur tersimpan bernomor, kolom ini mengembalikan jumlah prosedur tersimpan. Untuk informasi selengkapnya, lihat sys.numbered_procedures (Transact-SQL).

Adalah NULL untuk pernyataan ad hoc dan SQL yang disiapkan.
Dienkripsi bit 1 = Teks SQL dienkripsi.

0 = Teks SQL tidak dienkripsi.
text nvarchar(maks ) Teks kueri SQL.

Adalah NULL untuk objek terenkripsi.

Izin

VIEW SERVER STATE Memerlukan izin pada server.

Izin untuk SQL Server 2022 dan yang lebih baru

Memerlukan izin TAMPILKAN STATUS PERFORMA SERVER pada server.

Keterangan

Untuk kueri ad hoc, handel SQL adalah nilai hash berdasarkan teks SQL yang dikirimkan ke server, dan dapat berasal dari database apa pun.

Untuk objek database seperti prosedur tersimpan, pemicu, atau fungsi, handel SQL berasal dari ID database, ID objek, dan nomor objek.

Handel rencana adalah nilai hash yang berasal dari rencana yang dikompilasi dari seluruh batch.

Catatan

dbid tidak dapat ditentukan dari sql_handle untuk kueri ad hoc. Untuk menentukan dbid untuk kueri ad hoc, gunakan plan_handle sebagai gantinya.

Contoh

J. Contoh Konseptual

Berikut ini adalah contoh dasar untuk mengilustrasikan meneruskan sql_handle baik secara langsung atau dengan CROSS APPLY.

  1. Buat aktivitas.
    Jalankan T-SQL berikut di jendela kueri baru di SQL Server Management Studio.

    -- Identify current spid (session_id)
    SELECT @@SPID;
    GO
    
    -- Create activity
      WAITFOR DELAY '00:02:00';
    
  2. Menggunakan CROSS APPLY.
    Sql_handle dari sys.dm_exec_requests akan diteruskan ke sys.dm_exec_sql_text menggunakan CROSS APPLY. Buka jendela kueri baru dan lewati spid yang diidentifikasi di langkah 1. Dalam contoh ini spid kebetulan 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. Melewati sql_handle secara langsung.
    Dapatkan sql_handle dari sys.dm_exec_requests. Kemudian, teruskan sql_handle langsung ke sys.dm_exec_sql_text. Buka jendela kueri baru dan teruskan spid yang diidentifikasi di langkah 1 ke sys.dm_exec_requests. Dalam contoh ini spid kebetulan 59. Kemudian teruskan sql_handle yang dikembalikan sebagai argumen ke 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. Mendapatkan informasi tentang lima kueri teratas menurut waktu CPU rata-rata

Contoh berikut mengembalikan teks pernyataan SQL dan waktu CPU rata-rata untuk lima kueri teratas.

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. Menyediakan statistik eksekusi batch

Contoh berikut mengembalikan teks kueri SQL yang sedang dijalankan dalam batch dan memberikan informasi statistik tentang kueri tersebut.

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;  

Lihat juga

Tampilan dan Fungsi Manajemen Dinamis (Transact-SQL)
Tampilan dan Fungsi Manajemen Dinamis Terkait Eksekusi (Transact-SQL)
sys.dm_exec_query_stats (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sys.dm_exec_cursors (T-SQL)
sys.dm_exec_xml_handles (T-SQL)
sys.dm_exec_query_memory_grants (T-SQL)
Menggunakan APPLY
sys.dm_exec_text_query_plan (T-SQL)