我需要查找我的一些视图中使用的所有表。这些视图可能包含其他视图,因此我需要返回这些表,依此类推。我的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
我需要返回T1
和T2
的名称。
鉴于V2
我需要T1
,T2
和T5
。
鉴于V3
我需要T1
,T2
,T3
和T5
答案 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中还有一个功能可以让您查看对象的依赖项。右键单击对象资源管理器中的视图,然后选择“查看依赖项”。然后选择单选按钮“视图名称'所依赖的对象”。