Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Znajdź zależność kolumny

Skrypt @NoFuchsGavina zwykle działa świetnie, ale ma pewne ograniczenia ze względu na problemy z sysdepends (patrz ten post na blogu autorstwa Pinal Dave na przykład, gdy daje to nieprawidłowe wyniki).

Microsoft sugeruj również unikanie używania sysdepends w nowych pracach rozwojowych.

Dlatego możemy użyć sys.dm_sql_referencing_entities i sys.dm_sql_referenced_entities zgodnie z sugestią tutaj .

Zauważyłem jednak, że czasami wyklucza to odwołania do kolumn ze względu na referenced_minor_name bycie NULL. Dlatego dodałem inny warunek, który może wprowadzać fałszywe alarmy, ale zapewnia, że ​​odniesienia do kolumn nie zostaną pominięte w zestawie wyników.

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

Powyższy skrypt jest oparty na odpowiedzi @NoFuchsGavin i ten post na blogu .

Chciałbym wiedzieć, czy komuś udało się znaleźć lepszy sposób, który nie wprowadza fałszywych negatywów ani pozytywów.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Symulacja CONNECT BY PRIOR Oracle w SQL Server

  2. Jaki jest właściwy sposób wypełnienia listy DropDownList z bazy danych?

  3. Łączenie (konkatenowanie) daty i czasu w datetime

  4. Kryteria SQL Filter w kryteriach join lub klauzula where, która jest bardziej wydajna

  5. Przegląd instrukcji PRINT w SQL Server