ストアド プロシージャが実行されると、解析されてクエリ プランにコンパイルされます。これはキャッシュされ、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')
注意事項 これは、「中古」をどのように定義するかによって異なります。ストアド プロシージャ内の CTE がテーブルの 5 つの列を参照している可能性がありますが、この CTE を使用すると、3 つの列のみが渡されます。クエリ オプティマイザーはできる これらの余分なフィールドを無視し、計画に含めないでください。反対に、オプティマイザーは、出力に追加のフィールドを含めて、後でより適切なインデックスを使用できるようにすることで、より効率的なクエリを作成できると判断する場合があります。このコードは、クエリ プランで使用される列を返します。ストアド プロシージャ コードにある列と正確に一致しない場合があります。