Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso obter uma lista de todas as colunas referenciadas em um procedimento armazenado?


Quando um procedimento armazenado é executado, ele é analisado e compilado em um plano de consulta, é armazenado em cache e você pode acessá-lo via sys.dm_exec_cached_plans e sys.dm_exec_query_plan no formato XML. O plano de consulta registra a 'lista de saída' de cada seção do código analisado. Ver quais colunas são usadas pelo procedimento armazenado é apenas uma questão de consultar este XML, assim:
--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')

Advertência emptor isso depende de como você define 'usado'. Pode ser que um CTE em seu procedimento armazenado faça referência a 5 colunas de uma tabela, mas quando esse CTE é usado, apenas três das colunas são transmitidas. O otimizador de consulta pode ignore esses campos extras e não os inclua no plano. Por outro lado, o otimizador pode decidir que pode fazer uma consulta mais eficiente incluindo campos extras em uma saída para permitir que ele use um índice melhor posteriormente. Esse código retornará as colunas usadas pelo plano de consulta, elas podem não ser exatamente as colunas que estão no código do procedimento armazenado.