Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để có được danh sách tất cả các cột được tham chiếu trong một thủ tục được lưu trữ?

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ữ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi cài đặt SQL Server 2008:Các bản phát hành trước của Microsoft Visual Studio 2008

  2. Làm cách nào để xác định trong SQL Server nếu một phạm vi dateTime chồng lên một phạm vi khác

  3. sql server 2008 xml tệp vào bảng

  4. DataTable tải rất chậm

  5. Xác định các bước cho con trỏ máy chủ SQL - Hướng dẫn sử dụng SQL Server / TSQL