在特定列上查找依赖关系(现代方法,不使用sysdepends)

我需要找到所有使用特定表中的某个列的视图和存储过程。 以下方法“似乎”可以工作,但是有很多警告要小心使用这种方法(不可靠的原因很多,即将被弃用等)。
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
有一些常被提及的替代方法是sys.sql_dependencies和sys.sql_expression_dependencies,但这两种方法都不能实现列级细粒度。 请问有人知道如何做到这一点吗?即使你确定它确实无法实现,也会很有帮助知道。

1这个提示的第二个例子是用于列级别搜索的。 - user507
1个回答

以下是一个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; 

这看起来非常出色。您能否评论一下,这个是否与sysdepends有相同的“陈旧、过时”的问题?请参阅:https://sqlblog.org/2008/09/09/keeping-sysdepends-up-to-date-in-sql-server-2008 - tbone
另外,你有没有想法这样能解决嵌套依赖关系呢?比如说,一个生产环境依赖于一个视图,而该视图又依赖于表和列:如果我们在表和列上设置条件,那么结果中是否会同时显示视图和存储过程呢? - tbone
我就是不明白where条件有什么作用。TS想要找到对特定列的依赖关系。我认为条件应该限制在c.nameed.referenced_id/ed.referenced_entity_name上,不是吗? - pkuderov
在这里的2019年,sys.sql_dependencies现已进入维护模式,并且微软团队建议仅使用sys.sql_expression_dependencies。话虽如此,sys.sql_expression_dependencies似乎没有捕获相同的详细程度。 - 10762409
@10762409,谢谢你提供的信息。我看到sys.dm_sql_referenced_entities可能是解决方案,既可以找回在sys.sql_expression_dependencies中丢失的细节,也能保证未来的兼容性。 - Reversed Engineer