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

Tìm sự phụ thuộc của cột

Tập lệnh của @ NoFuchsGavin thường hoạt động tốt nhưng có một số hạn chế do sự cố với sysdepends (xem bài đăng trên blog này của Pinal Dave ví dụ trong đó điều này cho kết quả không chính xác).

Microsoft cũng khuyên bạn nên tránh sử dụng sysdepends trong công việc phát triển mới.

Do đó, chúng tôi có thể sử dụng sys.dm_sql_referencing_entitiessys.dm_sql_referenced_entities như được đề xuất tại đây .

Tuy nhiên, tôi nhận thấy rằng điều này đôi khi loại trừ các tham chiếu cột do referenced_minor_name là NULL. Do đó, tôi đã thêm một điều kiện khác có thể tạo ra kết quả dương tính giả nhưng đảm bảo rằng các tham chiếu cột không bị bỏ qua khỏi tập kết quả.

DECLARE @SchemaName sysname = '{0}';
DECLARE @TableName sysname  = '{1}';
DECLARE @ColumnName sysname = '{2}';

SELECT
    @SchemaName + '.' + @TableName                                      AS [USED_OBJECT],
    @ColumnName                                                         AS [COLUMN],
    referencing.referencing_schema_name + '.' + referencing_entity_name AS USAGE_OBJECT,
    CASE so.type
        WHEN 'C' THEN 'CHECK constraint'
        WHEN 'D' THEN 'Default'
        WHEN 'F' THEN 'FOREIGN KEY'
        WHEN 'FN' THEN 'Scalar function' 
        WHEN 'IF' THEN 'In-lined table-function'
        WHEN 'K' THEN 'PRIMARY KEY'
        WHEN 'L' THEN 'Log'
        WHEN 'P' THEN 'Stored procedure'
        WHEN 'R' THEN 'Rule'
        WHEN 'RF' THEN 'Replication filter stored procedure'
        WHEN 'S' THEN 'System table'
        WHEN 'SP' THEN 'Security policy'
        WHEN 'TF' THEN 'Table function'
        WHEN 'TR' THEN 'Trigger'
        WHEN 'U' THEN 'User table' 
        WHEN 'V' THEN 'View' 
        WHEN 'X' THEN 'Extended stored procedure'
    END                                             AS USAGE_OBJECTTYPE,
    so.[type]                                       AS USAGE_OBJECTTYPEID
FROM sys.dm_sql_referencing_entities
    (
        @SchemaName + '.' + @TableName,
        'object'
    ) referencing
    INNER JOIN sys.objects so 
        ON referencing.referencing_id = so.object_id
WHERE
    EXISTS
    (
        SELECT
            *
        FROM
            sys.dm_sql_referenced_entities
            (
                referencing_schema_name + '.' + referencing_entity_name,
                'object'
            ) referenced
        WHERE
            referenced_entity_name = @TableName
            AND 
            (
                referenced.referenced_minor_name LIKE @ColumnName   
                -- referenced_minor_name is sometimes NULL
                -- therefore add below condition (can introduce False Positives)
                OR
                (
                    referenced.referenced_minor_name IS NULL 
                    AND 
                    OBJECT_DEFINITION
                    (
                         OBJECT_ID(referencing_schema_name + '.' + referencing_entity_name)
                    ) LIKE '%' + @ColumnName + '%'
                )
            )
    )
ORDER BY
    USAGE_OBJECTTYPE,
    USAGE_OBJECT

Tập lệnh trên dựa trên câu trả lời của @ NoFuchsGavin và bài đăng trên blog này .

Tôi muốn biết liệu có ai đã tìm ra cách tốt hơn để không tạo ra các tiêu cực hoặc dương tính giả hay không.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm bản ghi sql chứa các chuỗi tương tự

  2. Truy vấn con sử dụng Tồn tại 1 hoặc Tồn tại *

  3. Thêm Zeros dẫn đầu &theo sau trong SQL Server

  4. DATEDIFF () so với DATEDIFF_BIG () trong SQL Server:Sự khác biệt là gì?

  5. SQL Server 2008 - NẾU KHÔNG TỒN TẠI CHÈN CẬP NHẬT ELSE