Když je uložená procedura spuštěna, je analyzována a zkompilována do plánu dotazů, tento je uložen do mezipaměti a můžete k němu přistupovat prostřednictvím sys.dm_exec_cached_plans a sys.dm_exec_query_plan ve formátu XML. Plán dotazů zaznamenává „výstupní seznam“ každé části analyzovaného kódu. Zjištění, které sloupce používá uložená procedura, je jen otázkou dotazování tohoto XML, například takto:
--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 to závisí na tom, jak definujete 'použité'. Může se stát, že CTE ve vaší uložené proceduře odkazuje na 5 sloupců z tabulky, ale když je tento CTE použit, jsou předány pouze tři sloupce. Optimalizátor dotazů může ignorujte tato nadbytečná pole a nezahrnujte je do plánu. Na druhé straně se může optimalizátor rozhodnout, že může vytvořit efektivnější dotaz zahrnutím dalších polí do výstupu, aby mohl později použít lepší index. Tento kód vrátí sloupce používané plánem dotazů, nemusí to být přesně ty sloupce, které jsou v kódu uložené procedury.