Khi một thủ tục được lưu trữ được thực thi, nó sẽ được phân tích cú pháp và biên dịch thành một kế hoạch truy vấn, nó được lưu vào bộ nhớ đệm và bạn có thể truy cập nó qua sys.dm_exec_cached_plans và sys.dm_exec_query_plan ở định dạng XML. Kế hoạch truy vấn ghi lại 'danh sách đầu ra' của từng phần của mã được phân tích cú pháp. Việc xem các cột nào được sử dụng bởi thủ tục được lưu trữ chỉ là vấn đề của việc truy vấn XML này, như thế này:
--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')
Người báo trước điều này phụ thuộc vào cách bạn xác định 'đã qua sử dụng'. Có thể một CTE trong thủ tục được lưu trữ của bạn tham chiếu đến 5 cột từ một bảng, nhưng sau đó khi CTE này được sử dụng, chỉ ba trong số các cột được chuyển sang. Trình tối ưu hóa truy vấn có thể bỏ qua các trường bổ sung này và không đưa chúng vào kế hoạch. Mặt khác, trình tối ưu hóa có thể quyết định rằng nó có thể thực hiện một truy vấn hiệu quả hơn bằng cách bao gồm các trường bổ sung trong đầu ra để cho phép nó sử dụng chỉ mục tốt hơn sau này. Mã này sẽ trả về các cột được kế hoạch truy vấn sử dụng, chúng có thể không chính xác là các cột có trong mã thủ tục được lưu trữ.