Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Temukan ketergantungan Kolom

Skrip @NoFuchsGavin biasanya berfungsi dengan baik tetapi memiliki beberapa keterbatasan karena masalah dengan sysdepends (lihat postingan blog ini oleh Pinal Dave untuk contoh di mana ini memberikan hasil yang salah).

Microsoft juga menyarankan agar Anda menghindari penggunaan sysdepends dalam pekerjaan pengembangan baru.

Oleh karena itu, kita dapat menggunakan sys.dm_sql_referencing_entities dan sys.dm_sql_referenced_entities seperti yang disarankan di sini .

Namun saya perhatikan bahwa ini terkadang mengecualikan referensi kolom karena referenced_minor_name menjadi NULL. Oleh karena itu saya telah menambahkan kondisi lain yang dapat menimbulkan kesalahan positif tetapi memastikan bahwa referensi kolom tidak dihilangkan dari kumpulan hasil.

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

Skrip di atas didasarkan pada jawaban @NoFuchsGavin dan entri blog ini .

Saya tertarik untuk mengetahui apakah ada yang berhasil menemukan cara yang lebih baik yang tidak menimbulkan negatif atau positif palsu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membuat kolom yang dihitung dari kolom lain?

  2. Cara Mengotomatiskan Pengumpulan Data pada Pertumbuhan Database SQL Server

  3. Gabungkan kunci utama dalam variabel tipe Tabel

  4. Kueri berjalan cepat, tetapi berjalan lambat dalam prosedur tersimpan

  5. Bergabung dengan 100 tabel