sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta kolumnberoende

@NoFuchsGavins skript fungerar vanligtvis utmärkt men har vissa begränsningar på grund av problem med sysdepends (se det här blogginlägget av Pinal Dave för ett exempel där detta ger felaktiga resultat).

Microsoft föreslår också att du undviker att använda sysdepends i nytt utvecklingsarbete.

Vi kan därför använda sys.dm_sql_referencing_entities och sys.dm_sql_referenced_entities som föreslagits här .

Jag har dock märkt att detta ibland utesluter kolumnreferenser på grund av referenced_minor_name vara NULL. Jag har därför lagt till ytterligare ett villkor som kan introducera falska positiva men säkerställer att kolumnreferenser inte utelämnas från resultatuppsättningen.

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

Ovanstående script är baserat på @NoFuchsGavins svar och det här blogginlägget .

Jag är intresserad av att veta om någon har lyckats hitta ett bättre sätt som inte introducerar falska negativa eller positiva.



  1. Kan inte starta sql-servern i enanvändarläge

  2. Hur gör man en add friend/defriend-funktion i PHP?

  3. Hur kan jag hämta inlägg med utvalda bilder från en WordPress-databas om WordPress inte längre är installerat?

  4. Finns det någon klass i MySql som är som BulkCopy Class i SQL Server 2005