查找与视图关联的所有表

时间:2013-02-16 01:51:54

标签: sql sql-server-2008 tsql

我需要查找我的一些视图中使用的所有表。这些视图可能包含其他视图,因此我需要返回这些表,依此类推。我的V是视图名称,T是表的名称。

Views | Tables
 V1   |   T1
 V2   |   T2
 V3   |   T3
      |   T4
      |   T5

现在让我说我的观点包含以下参考:

View | References
 V1  |   T1, T2
 V2  |   V1, T5
 V3  |   V1, V2, T3

因此V1我需要返回T1T2的名称。

鉴于V2我需要T1T2T5

鉴于V3我需要T1T2T3T5

1 个答案:

答案 0 :(得分:0)

您可以使用sys.dm_sql_referenced_entities选择对象所依赖的表和视图。请参阅Books Online article

此cte将以递归方式从sys.dm_sql_referenced_entities结果中显示的视图中选择表。它应该适合你。请参阅SQL Fiddle

DECLARE @viewName sysname = 'dbo.V3'
;WITH cteViews AS(
    SELECT 
         re.referenced_id
        ,o.type_desc    
        ,SCHEMA_NAME(o.schema_id) AS [schema]
        ,o.name
    FROM sys.dm_sql_referenced_entities (@viewName, 'OBJECT') re
    JOIN sys.objects o ON re.referenced_id = o.object_id 
    UNION ALL
    SELECT
         viewTables.referenced_id
        ,viewTables.type_desc
        ,viewTables.[schema]
        ,viewTables.name
    FROM cteViews cte
    OUTER APPLY(
        SELECT
             re.referenced_id
            ,o.type_desc    
            ,SCHEMA_NAME(o.schema_id) AS [schema]
            ,o.name
        FROM sys.dm_sql_referenced_entities (cte.[schema] + '.' + cte.name, 'OBJECT') re
        JOIN sys.objects o ON re.referenced_id = o.object_id 
        WHERE o.type_desc = 'USER_TABLE'
    ) AS viewTables
    WHERE cte.type_desc = 'VIEW'    
)
SELECT 
    [schema]
    ,name
FROM cteViews
WHERE type_desc <> 'VIEW'
ORDER BY name

SSMS中还有一个功能可以让您查看对象的依赖项。右键单击对象资源管理器中的视图,然后选择“查看依赖项”。然后选择单选按钮“视图名称'所依赖的对象”。