Когато се изпълнява съхранена процедура, тя се анализира и компилира в план на заявка, това се кешира и можете да получите достъп до него чрез sys.dm_exec_cached_plans и sys.dm_exec_query_plan в XML формат. Планът на заявката записва „изходния списък“ на всяка секция от анализирания код. Да видите кои колони се използват от съхранената процедура е само въпрос на запитване към този XML, като това:
--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 това зависи от това как дефинирате „използван“. Възможно е CTE във вашата съхранена процедура да препраща към 5 колони от таблица, но след това, когато се използва този CTE, се предават само три от колоните. Оптимизаторът на заявки може игнорирайте тези допълнителни полета и не ги включвайте в плана. От друга страна, оптимизаторът може да реши, че може да направи по-ефективна заявка, като включи допълнителни полета в изход, за да може да използва по-добър индекс по-късно. Този код ще върне колоните, използвани от плана на заявката, те може да не са точно колоните, които са в кода на запомнената процедура.