sql >> Database teknologi >  >> RDS >> Sqlserver

Find kolonneafhængighed

@NoFuchsGavins script fungerer normalt godt, men har nogle begrænsninger på grund af problemer med sysdepends (se dette blogindlæg af Pinal Dave for et eksempel, hvor dette giver forkerte resultater).

Microsoft foreslår også, at du undgår at bruge sysdepends i nyt udviklingsarbejde.

Vi kan derfor bruge sys.dm_sql_referencing_entities og sys.dm_sql_referenced_entities som foreslået her .

Jeg har dog bemærket, at dette nogle gange udelukker kolonnereferencer på grund af referenced_minor_name er NULL. Jeg har derfor tilføjet en anden betingelse, som kan introducere falske positiver, men sikrer, at kolonnereferencer ikke udelades fra resultatsættet.

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

Ovenstående script er baseret på @NoFuchsGavins svar og dette blogindlæg .

Jeg er interesseret i at vide, om nogen har formået at finde en bedre måde, som ikke introducerer falske negative eller positive.



  1. Wordpress Fatal fejl:Ufanget fejl:Kald til udefineret funktion mysql_connect() i /wp-includes/wp-db.php:1570

  2. MySQL mange-til-mange forhold til UDENLANDSKE NØGLER

  3. uafsluttet CSV-citeret felt i Postgres

  4. Fejlkolonnen c.CreatedOn eksisterer ikke... i PostgreSQL-logfiler under initialisering af kodekontekst ved hjælp af Devart dotConnect-udbyderen