T-SQL :: 枚举所有嵌套视图

T-SQL :: Enumerate all nested views

我手上有一个状态非常糟糕的数据库。

我惊恐地发现有嵌套视图(一个视图调用另一个视图)。

感谢 我知道如何查看视图是否具有来自 SSMS GUI 的依赖项。有没有办法查询整个数据库并枚举所有嵌套视图?

看看这是否能让您接近您正在寻找的东西。

SELECT DISTINCT
    sd.object_id,
    referencing_view_name = OBJECT_NAME(sd.object_id),
    sd.referenced_major_id,
    referenced_view_name = OBJECT_NAME(sd.referenced_major_id)
FROM
    sys.sql_dependencies sd
WHERE 
    EXISTS (SELECT 1 FROM sys.views v WHERE sd.object_id = v.object_id)
    AND EXISTS (SELECT 1 FROM sys.views v WHERE sd.referenced_major_id = v.object_id);

编辑:与原始信息相同,但使用 sys.sql_expression_dependencies 代替 sys.sql_dependencies

SELECT 
    sed.referencing_id,
    referencing_view_name = OBJECT_NAME(sed.referencing_id),    
    sed.referenced_id,
    referenced_view_name = sed.referenced_entity_name
FROM
    sys.sql_expression_dependencies sed
WHERE 
    EXISTS (SELECT 1 FROM sys.views v WHERE sed.referencing_id = v.object_id)
    AND EXISTS (SELECT 1 FROM sys.views v WHERE sed.referenced_id = v.object_id);

以下查询使用 non-deprecated 系统视图 sys.sql_expression_dependencies 获取视图引用的视图名称:

select Ving.name as ReferencingViewName, Ved.name as ReferencedViewName
  from sys.sql_expression_dependencies as SED inner join
    sys.views as Ving on Ving.object_id = SED.referencing_id inner join
    sys.views as Ved on Ved.object_id = SED.referenced_id;