Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Намерете зависимостта на колоната

Скриптът на @NoFuchsGavin обикновено работи чудесно, но има някои ограничения поради проблеми с sysdepends (вижте тази публикация в блог от Pinal Dave за пример, когато това дава неправилни резултати).

Microsoft също препоръчваме да избягвате използването на 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL PIVOT с три колони

  2. Debezium:Няма записан максимален LSN в базата данни; моля, уверете се, че SQL Server Agent работи

  3. SQL Server Преобразуване на цяло число в двоичен низ

  4. Tomcat, Java &SQL Server 2008 R2:Не може да се създаде JDBC драйвер от клас '' за URL адрес за свързване 'null'

  5. Инструкцията INSERT е в конфликт с ограничението FOREIGN KEY - SQL Server