sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu získat seznam všech sloupců odkazovaných v uložené proceduře?

Když je uložená procedura spuštěna, je analyzována a zkompilována do plánu dotazů, tento je uložen do mezipaměti a můžete k němu přistupovat prostřednictvím sys.dm_exec_cached_plans a sys.dm_exec_query_plan ve formátu XML. Plán dotazů zaznamenává „výstupní seznam“ každé části analyzovaného kódu. Zjištění, které sloupce používá uložená procedura, je jen otázkou dotazování tohoto XML, například takto:

--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')

Caveat emptor to závisí na tom, jak definujete 'použité'. Může se stát, že CTE ve vaší uložené proceduře odkazuje na 5 sloupců z tabulky, ale když je tento CTE použit, jsou předány pouze tři sloupce. Optimalizátor dotazů může ignorujte tato nadbytečná pole a nezahrnujte je do plánu. Na druhé straně se může optimalizátor rozhodnout, že může vytvořit efektivnější dotaz zahrnutím dalších polí do výstupu, aby mohl později použít lepší index. Tento kód vrátí sloupce používané plánem dotazů, nemusí to být přesně ty sloupce, které jsou v kódu uložené procedury.



  1. nelze přidat tabulku mysql db do zdroje dat vb

  2. Vytvořte UDF vázaný na schéma na serveru SQL Server

  3. Global Temp Tables - SQL Server vs Oracle

  4. Sql Server deterministická uživatelsky definovaná funkce