Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya bisa mendapatkan daftar semua kolom yang dirujuk dalam prosedur tersimpan?

Ketika prosedur tersimpan dijalankan, prosedur tersebut diurai dan dikompilasi ke dalam rencana kueri, ini di-cache dan Anda dapat mengaksesnya melalui sys.dm_exec_cached_plans dan sys.dm_exec_query_plan dalam format XML. Rencana kueri mencatat 'daftar keluaran' dari setiap bagian kode yang diurai. Melihat kolom mana yang digunakan oleh prosedur tersimpan hanyalah masalah kueri XML ini, seperti ini:

--Execute the stored procedure to put its query plan in the cache
exec sys.sp_columns ''

DECLARE @TargetObject nvarchar(100) = 'sys.sp_columns';

WITH XMLNAMESPACES (
    'http://schemas.microsoft.com/sqlserver/2004/07/showplan' as ns1
), CompiledPlan AS (
    SELECT 
        (SELECT query_plan FROM sys.dm_exec_query_plan(cp.plan_handle)) qp,
        (SELECT ObjectID FROM sys.dm_exec_sql_text(cp.plan_handle)) ob
    FROM sys.dm_exec_cached_plans cp
    WHERE objtype = 'Proc'
), ColumnReferences AS (
    SELECT DISTINCT
        ob,
        p.query('.').value('./ns1:ColumnReference[1]/@Database', 'sysname') AS [Database],
        p.query('.').value('./ns1:ColumnReference[1]/@Schema', 'sysname') AS [Schema],
        p.query('.').value('./ns1:ColumnReference[1]/@Table', 'sysname') AS [Table],
        p.query('.').value('./ns1:ColumnReference[1]/@Column', 'sysname') AS [Column]
    FROM CompiledPlan
        CROSS APPLY qp.nodes('//ns1:ColumnReference') t(p)
)

SELECT 
    [Database], 
    [Schema], 
    [Table], 
    [Column]
FROM ColumnReferences 
WHERE 
    [Database] IS NOT NULL AND 
    ob = OBJECT_ID(@TargetObject, 'P')

Peringatan emptor ini tergantung pada bagaimana Anda mendefinisikan 'digunakan'. Mungkin CTE dalam prosedur tersimpan Anda mereferensikan 5 kolom dari sebuah tabel, tetapi kemudian ketika CTE ini digunakan hanya tiga kolom yang diteruskan. Pengoptimal kueri mungkin mengabaikan bidang tambahan ini dan tidak memasukkannya ke dalam rencana. Di sisi lain, pengoptimal dapat memutuskan bahwa ia dapat membuat kueri yang lebih efisien dengan memasukkan bidang tambahan dalam output untuk memungkinkannya menggunakan indeks yang lebih baik di kemudian hari. Kode ini akan mengembalikan kolom yang digunakan oleh rencana kueri, kolom tersebut mungkin tidak persis seperti kolom yang ada dalam kode prosedur tersimpan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kueri SQL Server untuk mengelompokkan data tanggal berurutan

  2. SQL:Kolom Akumulatif &Jumlah Seluruh Baris

  3. Buat pekerjaan SQL Server secara otomatis

  4. Jalankan prosedur tersimpan sebagai izin pengguna lain

  5. Optimalkan kinerja sub-kueri