Wanneer een opgeslagen procedure wordt uitgevoerd, wordt deze geparseerd en gecompileerd in een queryplan, dit wordt in de cache opgeslagen en u kunt het openen via sys.dm_exec_cached_plans en sys.dm_exec_query_plan in XML-indeling. Het queryplan legt de 'outputlijst' van elke sectie van de geparseerde code vast. Om te zien welke kolommen door de opgeslagen procedure worden gebruikt, hoeft u alleen maar deze XML op te vragen, zoals dit:
--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')
Voorbehoud dit hangt af van hoe je 'gebruikt' definieert. Het kan zijn dat een CTE binnen uw opgeslagen procedure verwijst naar 5 kolommen uit een tabel, maar wanneer deze CTE wordt gebruikt, worden er slechts drie van de kolommen doorgegeven. De query-optimizer mag negeer deze extra velden en neem ze niet op in het plan. Aan de andere kant kan de optimizer besluiten dat hij een efficiëntere zoekopdracht kan maken door extra velden in een uitvoer op te nemen, zodat hij later een betere index kan gebruiken. Deze code retourneert de kolommen die worden gebruikt door het queryplan, het zijn mogelijk niet precies de kolommen die in de opgeslagen procedurecode staan.