没有弃用SYS视图的SQL Server列依赖项

时间:2017-10-03 19:53:16

标签: sql-server

我正在收集有关从“对象”到列级别的依赖关系的信息(例如,存储过程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的某个未来版本中,我将无法获得列级依赖关系信息。由于我没有提到的一些信息,我的结论是否不正确?

1 个答案:

答案 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)。