我正在收集有关从“对象”到列级别的依赖关系的信息(例如,存储过程X使用表A列C0和C1)。
我发现我的SQL Server 2012数据库通过sys.sql_dependencies给我列级依赖关系信息(因为column_minor_id列不一样为零)并且它不通过sys.sql_expression_dependencies给我列级依赖信息(因为列referenced_minor_id相同为零。)
不推荐docs说sys.sql_dependencies有利于sys.sql_expression_dependencies,但看起来好像“较新”的视图不提供列级信息(即使它看起来有一个列用于此目的)
我的结论是,在SQL Server的某个未来版本中,我将无法获得列级依赖关系信息。由于我没有提到的一些信息,我的结论是否不正确?
答案 0 :(得分:1)
您可以获得该信息,但需要做更多工作。来自sys.sql_expression_dependencies
文档:
您可以使用此目录视图来报告相关信息 以下实体:
[其他实体]
对架构绑定实体的列级依赖关系。列级 可以使用返回非模式绑定对象的依赖项 sys.dm_sql_referenced_entities
因此,您可以在该视图中获取模式绑定实体(例如计算列)的列信息,但对于非模式绑定实体(例如常规视图),您需要将其与sys.dm_sql_referenced_entities
结合使用:
select referencing_id, objects.name as referencing_name,
dependencies.referenced_id, dependencies.referenced_entity_name as referenced_name,
entities.referenced_minor_id as column_id, entities.referenced_minor_name as column_name,
is_schema_bound_reference
from sys.sql_expression_dependencies as dependencies
join sys.objects as objects on object_id=referencing_id
join sys.schemas as schemas on schemas.schema_id=objects.schema_id
cross apply sys.dm_sql_referenced_entities(schemas.name+'.'+objects.name,'OBJECT') as entities
where entities.referenced_entity_name=dependencies.referenced_entity_name
and (is_schema_bound_reference=0 or entities.referenced_minor_id=dependencies.referenced_minor_id)
此查询将返回绑定和非绑定实体的列信息,也会返回不具有列的实体,如标量函数(表触发器也包含在OBJECT
类型中)
最后请注意,虽然语法文档将其显示为可选项,但似乎需要在sys.dm_sql_referenced_entities
的第一个参数中使用模式名称(我没有仅使用对象名称获得任何结果) SQL Server 2008,2012和2014)。