sql >> データベース >  >> RDS >> Sqlserver

列の依存関係を検索

    @NoFuchsGavin のスクリプトは通常はうまく機能しますが、sysdepends の問題によりいくつかの制限があります (Pinal Dave によるこのブログ投稿 これが間違った結果をもたらす例)。

    マイクロソフト また、sysdepends の使用を避けることをお勧めします

    したがって、sys.dm_sql_referencing_entities を使用できます。 および sys.dm_sql_referenced_entities 提案どおり ここ .

    ただし、これにより referenced_minor_name が原因で列参照が除外される場合があることに気付きました NULL であること。したがって、誤検知を引き起こす可能性がありますが、列参照が結果セットから省略されないようにする別の条件を追加しました。

    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
      

    上記のスクリプトは、@NoFuchsGavin の回答と このブログ投稿 .

    誰かが偽陰性や偽陽性を導入しないより良い方法を見つけたのか知りたい.



    1. ボタンをクリックするとSQLクエリが起動しますか?

    2. postgresqlを使用してsqlalchemyで配列リテラルの型を明示的にキャストする方法は?

    3. PHPあるテーブルから別のテーブルにデータを挿入する

    4. IDとグループに基づく値の減算