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.