查找特定列的依赖项(现代方式,不使用 sysdepends)

tbo*_*one 15 sql-server

我需要找到不仅使用某个表,而且使用表中特定列的所有视图和存储过程。

以下“似乎”有效,但有许多警告要小心使用此方法(由于各种原因不可靠,很快将被弃用等):

SELECT object_name(so.id) TableName, sc.name ColumnName, OBJECT_NAME(sd.id) DependentObjectName,
(SELECT xtype FROM sysobjects so WHERE so.id = sd.id) Object_Type
FROM sysobjects so INNER JOIN syscolumns sc
ON so.id = sc.id
INNER JOIN sysdepends sd
ON so.id = sd.depid and sc.colid = sd.depnumber
WHERE 
    object_name(so.id) = 'MyTableName'
AND sc.name = 'MyColumnName'
order by object_name(so.id), Object_Type
Run Code Online (Sandbox Code Playgroud)

一些经常被引用的替代方法是 sys.sql_dependencies 和 sys.sql_expression_dependencies,但它们都没有列级粒度。

有谁知道这样做的方法?(或者,即使您明确知道它实际上无法完成,知道它也会有所帮助。)

Gle*_*wan 13

这是一个关于查看列依赖关系的 AdventureWorks 示例。

SELECT ReferencingObject = SCHEMA_NAME(o1.schema_id) + '.' + o1.name,
       ReferencedObject = SCHEMA_NAME(o2.schema_id) + '.'
                          + ed.referenced_entity_name,
       ColumnName = c.name,
       ReferencedObjectType = o2.type,
       ReferencingObjecType = o1.type
FROM   AdventureWorks2012.sys.sql_expression_dependencies ed
       INNER JOIN AdventureWorks2012.sys.objects o1
               ON ed.referencing_id = o1.object_id
       INNER JOIN AdventureWorks2012.sys.objects o2
               ON ed.referenced_id = o2.object_id
       INNER JOIN AdventureWorks2012.sys.sql_dependencies d
               ON ed.referencing_id = d.object_id
                  AND d.referenced_major_id = ed.referenced_id
       INNER JOIN sys.columns c
               ON c.object_id = ed.referenced_id
                  AND d.referenced_minor_id = c.column_id
WHERE  SCHEMA_NAME(o1.schema_id) + '.' + o1.name = 'HumanResources.vEmployee' AND c.name = 'JobTitle'
ORDER  BY ReferencedObject,
          c.column_id; 
Run Code Online (Sandbox Code Playgroud)