转自:使用sql命令查询视图中所有引用的基础表

使用sql命令查询视图中所有引用的基础表

之前有写过如何利用sql查询视图中所有引用的表发现这个方法并不能查出视图中所有的基础表,如果视图中有嵌套视图就会有问题,因为目录视图sys.sql_dependencies并不包含所有的引用实体。后面发现在sql2008及以后的版本中推出的sys.sql_expression_dependencies视图解决了这一问题,所以重新写了段sql,用来查询视图中所有引用的基础表,包括嵌套视图中的基础表。这个有什么作用呢,各人有各人的用处吧,我是用来估计和优化视图的效率的,如果视图中引用的基础表太多,是不是就会在一定程度上影响性能呢?

查询的sql语句如下:

declare @v_name varchar(50)
set @v_name='v_view' --需要查询的视图名

declare @t_temp_referenced table
(
tname varchar(50),
ttype varchar(10),
tlevel int
)

insert into @t_temp_referenced(tname,ttype,tlevel)
select a.referenced_entity_name,b.xtype,0 from 
(
select distinct referenced_entity_name from sys.sql_expression_dependencies 
 where referencing_id = object_id(@v_name) and [referenced_class] = 1 and [is_ambiguous] = 0
) a
left join sys.sysobjects b on  a.referenced_entity_name=b.name

declare @name varchar(50)
declare @level int
set @level=0

while (select count(1) from @t_temp_referenced where ttype='V' and tlevel=@level) >0
begin
declare result cursor local for select tname from @t_temp_referenced where ttype='V' and tlevel=@level
open result
fetch next from result into @name
while @@fetch_status=0
begin
insert into @t_temp_referenced(tname,ttype,tlevel)
select a.referenced_entity_name,b.xtype,@level+1 from 
(
select distinct  referenced_entity_name from sys.sql_expression_dependencies 
 where referencing_id = object_id(@name) and [referenced_class] = 1 and [is_ambiguous] = 0
) a
left join sys.sysobjects b on  a.referenced_entity_name=b.name 
where not exists(select 1 from @t_temp_referenced t1
where t1.tname=a.referenced_entity_name and t1.ttype=b.xtype and t1.tlevel=@level+1 )

fetch next from result into @name
end

close result
deallocate result

set @level=@level+1
end

select distinct tname from @t_temp_referenced 
where ttype='U'

注意:sys.sql_expression_dependencies视图只有sql2008及以上版本才有,sql2005是没有的
复制sys.sql_expression_dependencies视图的说明如下:

列名 数据类型 说明
referencing_id int 引用实体的 ID。不可为 Null。
referencing_minor_id int 引用实体为列时的列 ID;否则为 0。不可为 Null。
referencing_class tinyint 引用实体的类。
1 = 对象或列
12 = 数据库 DDL 触发器
13 = 服务器 DDL 触发器
不可为 Null。
referencing_class_desc nvarchar(60) 对引用实体的类的说明。
OBJECT_OR_COLUMN
DATABASE_DDL_TRIGGER
SERVER_DDL_TRIGGER
不可为 Null。
is_schema_bound_reference bit 1 = 被引用的实体绑定到架构。
0 = 被引用的实体未绑定到架构。
不可为 Null。
referenced_class tinyint 被引用的实体的类。
1 = 对象或列
6 = 类型
10 = XML 架构集合
21 = 分区函数
不可为 Null。
referenced_class_desc nvarchar(60) 对被引用的实体的类的说明。
OBJECT_OR_COLUMN
TYPE
XML_SCHEMA_COLLECTION
PARTITION_FUNCTION
不可为 Null。
referenced_server_name sysname 被引用的实体的服务器的名称。
此列是为通过指定由四个部分组成的有效名称所生成的跨服务器依赖关系填充的。有关由多个部分组成的名称的信息。
对于非绑定到架构的实体,如果实体被引用时没有指定由四个部分组成的名称,此列为 NULL。
对于绑定到架构的实体,此列为 NULL,原因在于它们必须在同一数据库中,因而只能使用由两个部分 (schema.object) 组成的名称定义。
referenced_database_name sysname 被引用的实体的数据库的名称。
此列是为通过指定由三个部分或四个部分组成的有效名称生成的跨数据库或跨服务器引用填充的。
对于非绑定到架构的引用,当使用由一个部分或两个部分组成的名称指定时,此列为 NULL。
对于绑定到架构的实体,此列为 NULL,原因在于它们必须在同一数据库中,因而只能使用由两个部分 (schema.object) 组成的名称定义。
referenced_schema_name sysname 被引用的实体所属的架构。
对于非绑定到架构的引用,如果实体被引用时没有指定架构名称,此列为 NULL。
对于绑定到架构的引用,此列永不为 NULL,原因在于必须使用由两部分组成的名称来定义和引用绑定到架构的实体。
referenced_entity_name sysname 被引用的实体的名称。不可为 Null。
referenced_id int 被引用的实体的 ID。
对于跨服务器和跨数据库引用,此列始终为 NULL。
对于数据库内的引用,如果无法确定 ID,则为 NULL。对于非绑定到架构的引用,在以下情况下将无法解析 ID:

  • 被引用实体不存在于数据库中。
  • 被引用的实体的架构依赖于调用方的架构,并在运行时解析。在这种情况下,is_caller_dependent 设置为 1。

对于绑定到架构的引用,此列永远不会为 NULL。

referenced_minor_id int 引用实体为列时被引用的列的 ID;否则为 0。不可为 Null。
当列在引用实体中按名称标识时,或者当 SELECT * 语句中使用了父实体时,被引用的实体为列。
is_caller_dependent bit 指示被引用的实体的架构绑定在运行时发生,因此,实体 ID 的解析依赖于调用方的架构。当被引用的实体为存储过程、扩展存储过程或在 EXECUTE 语句中调用的非绑定到架构的用户定义函数时,将会出现这种情况。
1 = 被引用的实体依赖于调用方并在运行时解析。在这种情况下,referenced_id 为 NULL。
0 = 被引用的实体 ID 不依赖调用方。
对于绑定到架构的引用、显式指定架构名称的跨数据库和跨服务器的引用,始终为 0。例如,对格式为 EXEC MyDatabase.MySchema.MyProc 的实体的引用不依赖于调用方。但是,格式为 EXEC MyDatabase..MyProc 的引用依赖调用方。
is_ambiguous bit 指示引用为不明确引用,并可以在运行时解析为用户定义函数、用户定义类型 (UDT) 或者对 xml 类型的列的 xquery 引用。
例如,假定语句 SELECT Sales.GetOrder() FROM Sales.MySales 是在存储过程中定义的。在执行存储过程之前,并不知道 Sales.GetOrder() 是 Sales 架构中的用户定义函数还是带有名为 GetOrder() 的方法、类型为 UDT 且名为 Sales 的列。
1 = 引用不明确。
0 = 引用是明确的,或者在调用视图时可以成功绑定实体。
对于绑定到架构的引用始终为 0。

转发:使用sql命令查询视图中所有引用的基础表的更多相关文章

  1. Windows自带强大的入侵检测工具——Netstat 命令 查询是否中木马

    Netstat命令可以帮助我们了解网络的整体使用情况.根据Netstat后面参数的不同,它可以显示不同的网络连接信息.Netstat的参数如图,下面对其中一些参数进行说明.如何检测本机是否有被中木马, ...

  2. SQL语句查询关键字中含有特殊符号怎么处理, 例如 'SMI_'

    SQL语句查询关键字中含有特殊符号怎么处理, 例如 'SMI_' 错误:select * from emp  where ename like '%SML_%' 正确:select * from em ...

  3. SQL like查询条件中的通配符处理

    1. SQL like对时间查询的处理方法 SQL数据表中有savetime(smalldatetime类型)字段,表中有两条记录,savetime值为:2005-3-8 12:12:00和2005- ...

  4. SQL Server 查询处理中的各个阶段(SQL执行顺序)

    SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...

  5. 利用SQL语句查询数据库中所有表

    Oracle: SELECT * FROM ALL_TABLES;系统里有权限的表 SELECT * FROM DBA_TABLES; 系统表 SELECT * FROM USER_TABLES; 当 ...

  6. Sql server 查询数据库中包含某字段的所有的表

    我们有时候会需要查询数据库中包含某字段的所有的表,去进行update,这时就可以用下面的SQL来实现: select object_name(id) objName,Name as colName f ...

  7. sql语句查询数据库中的表名/列名/主键/自动增长值

    原文地址:http://blog.csdn.net/pukuimin1226/article/details/7687538 ----查询数据库中用户创建的表 ----jsj01 为数据库名 sele ...

  8. SQL 将查询结果插入到另一张表中

    INSERT INTO (1) 如果两张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT * FROM 来源表 WHERE 条件; ...

  9. SQL命令查询Oracle存储过程信息(代码内容等)

    SELECT * FROM ALL_SOURCE  where TYPE='PROCEDURE'  AND TEXT LIKE '%0997500%'; --查询ALL_SOURCE中,(脚本代码)内 ...

随机推荐

  1. Redis 作为缓存服务器的配置

    随着redis的发展,越来越多的架构用它取代了memcached作为缓存服务器的角色,它有几个很突出的特点:1. 除了Hash,还提供了Sorted Set, List等数据结构2. 可以持久化到磁盘 ...

  2. linux操作系统下的码农常用工具

    IDE: Pycharm PHPStorm Zend Studio 文本编辑器: VIM Sublime Text 版本管理: svn RapidSVN git git ui 文件对比: Meld D ...

  3. php 邮件类

    编写一个用php socket 发送邮件的类,简单好用,当用到php程序发送邮件时, 而在163服务器中,可以在RCPT命令中还可以验证163邮箱是否存在,还有很多用处, 我现在暂时还没想到. 记录下 ...

  4. Fiddler 域名过滤

    原来一直没意识到Fiddler过滤,导致每次抓包都要自己判断.搜索好多东西,真是呵呵! 过滤设置很简单,看懂一张图就解决问题了. 箭头 那两处设置下,圆圈处保存再进行抓包即可

  5. 实测Eclipse连接小米2S调试问题

    小米2S手机在Eclipse真机调试时,设备选择列表无法显示手机,DDMS也连接不上设备,解决步骤: 1.打开手机设置中开发者选项 - USB调试开启: 2.保证小米2S手机Windows下设备驱动已 ...

  6. C语言的本质(19)——预处理之一:宏定义

    我们在写代码时已多次使用过以"#"号开头的预处理命令.如包含命令#include,宏定义命令#define等.在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为 ...

  7. GPS功能:百度路书自定义【轨迹回放】

    如题所述:百度的编辑界面很直观,修改后就可以运行,地址:http://developer.baidu.com/map/jsdemo.htm#c2_8: 因为同事研究了一下午结果都没搞出来,他copy百 ...

  8. 关于清晰讲解linux正则表达式的博文分享

    http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html  linux shell 正则表达式(BREs,EREs,PREs)差异比 ...

  9. hdu 1690 The Balance_母函数

    题意:给你n个数,这些数可以互相加或者减,输出在范围[1,sum]里不能通过运算得出的数 思路:套母函数模版 #include <iostream> #include<cstdio& ...

  10. DevC++ 工程没有调试信息的解决办法

    DevC++4.9.9.2中,按 F8 开始调试.提示信息为:工程没有调试信息,您想打开工程的调试选项并重新生成吗?选择是后,再按F8,仍旧是这个信息.什么原因呢? 按照帮助,Frequently A ...