sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag få en lista över alla kolumner som refereras till i en lagrad procedur?

När en lagrad procedur körs tolkas den och kompileras till en frågeplan, denna cachelagras och du kan komma åt den via sys.dm_exec_cached_plans och sys.dm_exec_query_plan i XML-format. Frågeplanen registrerar "utdatalistan" för varje sektion av den analyserade koden. Att se vilka kolumner som används av den lagrade proceduren är bara en fråga om att fråga denna XML, så här:

--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 detta beror på hur du definierar "använd". Det kan vara så att en CTE i din lagrade procedur refererar till 5 kolumner från en tabell, men när denna CTE används skickas bara tre av kolumnerna vidare. Frågeoptimeraren kan ignorera dessa extra fält och inte inkludera dem i planen. På baksidan kan optimeraren besluta att den kan göra en mer effektiv fråga genom att inkludera extra fält i en utdata för att göra det möjligt för den att använda ett bättre index senare. Den här koden returnerar kolumnerna som används av frågeplanen, de kanske inte exakt är kolumnerna som finns i den lagrade procedurkoden.



  1. Integrera sökning på en webbplats där backend är MYSQL

  2. Hur du säkerhetskopierar din Moodle MariaDB-databas

  3. Spring Boot:Jdbc javax.net.ssl.SSLEUndantag:stänger inkommande innan man tar emot peers close_notify

  4. Problem med att använda SQL Agent för att köra SSIS-paket - misslyckas med DTSER_FAILURE(1)