在SQL Server中确定视图引用的表

8
如何了解 SQL Server 中视图使用的表?是否有脚本或工具可以让我知道视图中使用的表,并列出字段?希望这清楚了问题,如果有疑问请告诉我。请指导!谢谢!

可能是SQL Server存储过程中的文本搜索的重复问题。您可以找到依赖项,但无法获取字段列表。 - gbn
这不是在SQL Server存储过程中进行文本搜索的完全重复。已经存在一个单独的答案。请不要投票关闭。 - GSerg
5个回答

8
select
  cols.*
from
  sys.sql_expression_dependencies objs
  outer apply sys.dm_sql_referenced_entities ( OBJECT_SCHEMA_NAME(objs.referencing_id) + N'.' + object_name(objs.referencing_id), N'OBJECT' ) as cols
where
  objs.referencing_id = object_id('view_name_here')

参考文献: sys.dm_sql_referenced_entities (Transact-SQL).


@Xorpower 我刚写了这个,查看了BOL中所需的sysview。它确实有效,表名在referenced_entity_name中,列名在referenced_minor_name中。如果对你不起作用,请尝试提供一个更合格的视图名称(例如dbo.view_name)或重新编译视图再进行检查。 - GSerg
只有当一个视图引用另一个视图时,这才有效。在我的情况下,reference_entity_name 显示被引用的另一个视图,而不是表名。是的,列名在 ref_minor_name 中。 - xorpower
@Xorpower,那么你的数据库还存在其他问题。该查询确实显示了所有引用的表和视图。为了再次确认,请下载SQL Server管理器(免费版本),打开你的视图并切换到“依赖项”选项卡。 - GSerg
3
为什么不直接使用select referenced_entity_name,referenced_minor_name from sys.dm_sql_referenced_entities ( 'dbo.foo', N'OBJECT' ) where referenced_minor_name is not nullOUTER APPLY 看起来只是重复调用相同的值并带来额外的行。 - Martin Smith
马丁,你的脚本真的有效!但是有没有办法知道实体名称是表还是视图?我有一个引用其他视图的视图。 - xorpower
显示剩余4条评论

1

查看(大多数)对象内容的最简单方法是:

sp_helptext blah

在这里,您可以用对象的名称替换 blah。这将产生创建该对象的实际代码。例如,在这种情况下,它可能会导致:

CREATE VIEW blah
AS
  select blah.column1,blah.column2 from blah_table

1
使用以下简单查询,您可以了解视图中使用了哪些表:
SELECT view_name, Table_Name
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE View_Name = 'ViewName'

0

这些信息可以从INFORMATION_SCHEMA获取

SELECT * 
    FROM    INFORMATION_SCHEMA.VIEW_COLUMN_USAGE AS cu
    JOIN    INFORMATION_SCHEMA.COLUMNS AS c
    ON      c.TABLE_SCHEMA  = cu.TABLE_SCHEMA
    AND     c.TABLE_CATALOG = cu.TABLE_CATALOG
    AND     c.TABLE_NAME    = cu.TABLE_NAME
    AND     c.COLUMN_NAME   = cu.COLUMN_NAME
    WHERE   cu.VIEW_NAME    = 'viewtablename';

-1
你可以使用 DISTINCT 来仅获取表格。
  Select   DISTINCT cols.referenced_entity_name from  
   sys.sql_expression_dependencies objs   outer apply
   sys.dm_sql_referenced_entities (
   OBJECT_SCHEMA_NAME(objs.referencing_id) + N'.' +
   object_name(objs.referencing_id), N'OBJECT' ) as cols where  
   objs.referencing_id = object_id('viewname')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接