欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » Sql随手笔记 » 正文

热门阅读

如何利用SQL查询视图所引用的所有表

创建时间:2011年10月17日 23:06  阅读次数:(8704)
分享到:
我们在检查视图性能时,通常会查看视图中到底引用了那些表。当然,我们可以利用sp_helptext查看视图的定义。但在这章,我们主要讲解如何利用SQL快速地查看指定视图所引用的所有表。

在此之前,我们先了解一下目录视图sys.sql_dependencies,该视图的解释如下:
"在定义某些其他引用(相关)对象的 SQL 表达式或语句中进行引用时,被引用(独立)实体的每个相关性在表中均对应一行。任何对象或列的定义属性包含 SQL 表达式时,都可以有相关性"
上面的解释可能比较拗口,简单的理解就是如果在某个SQL定义(如:视图,函数,触发器等)中如果引用了某个表,那么就会在sys.sql_dependencies中存在一条对应的记录。而且,如果引用了这个表的多个列,那么就会有多条记录。

sys.sql_dependencies返回的重要的列:
object_id--定义的对象ID(在本章就是指我们要查询的视图名)
referenced_major_id--被引用的实体的ID(在本章就是被引用表的名称)
referenced_minor_id--被引用的实体的列的ID(在本章就是被引用表的列的ID)

大家可以通过select * from sys.sql_dependencies查看结果就能明白了。

了解了这些,返回视图所引用所有表的SQL语句就变的很简单了,示例如下:
select distinct object_name(referenced_major_id) as referencedname from sys.sql_dependencies 


如果还需要查询出所有被引用的列,可以使用如下SQL语句:
select object_name(A.object_id) as object_name,B.Name as ColumnName
 from sys.sql_dependencies A 
left join sys.columns B on A.referenced_minor_id=B.column_id and A.referenced_major_id=B.object_id


延伸:因为在视图中除了引用表之外,还有可能引用函数等,所以我们还应该查询出所引用实体的类型,示例SQL如下:
declare @viewname varchar(50)
set @viewname='v_Salary'--假设的视图名
select @viewname as name,
name as referencedname,
type--所引用实体的类型
from sys.objects 
where name in (
select distinct object_name(referenced_major_id) as referencedname
 from sys.sql_dependencies 
where object_id=object_id(@viewname))


以上就是本节所有内容了,如果有不对或者更好的方法,请大家在评论中讨论,共同参入,才会更精彩!
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 98+9=? 的结果(结果是:107)
结  果: