sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg få en liste over alle kolonner, der henvises til i en lagret procedure?

Når en lagret procedure udføres, parses den og kompileres til en forespørgselsplan, denne cachelagres, og du kan få adgang til den via sys.dm_exec_cached_plans og sys.dm_exec_query_plan i XML-format. Forespørgselsplanen registrerer 'outputlisten' for hver sektion af den parsede kode. At se, hvilke kolonner der bruges af den lagrede procedure, er bare et spørgsmål om at forespørge denne XML, sådan her:

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

Forbehold emptor dette afhænger af, hvordan du definerer 'brugt'. Det kan være, at en CTE i din lagrede procedure refererer til 5 kolonner fra en tabel, men når denne CTE bruges, videregives kun tre af kolonnerne. Forespørgselsoptimeringsværktøjet kan ignorere disse ekstra felter og ikke inkludere dem i planen. På bagsiden kan optimeringsværktøjet beslutte, at det kan lave en mere effektiv forespørgsel ved at inkludere ekstra felter i et output for at gøre det muligt for det at bruge et bedre indeks senere. Denne kode returnerer de kolonner, der bruges af forespørgselsplanen, de er muligvis ikke ligefrem de kolonner, der er i den lagrede procedurekode.



  1. Fylder en kombinationsboks med mysql-data

  2. Hvordan får man næste/forrige rekord i MySQL?

  3. MySQL-fejl:Authentication plugin 'caching_sha2_password' kan ikke indlæses

  4. Udfør en lagret procedure som en anden brugertilladelse