仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 986|回复: 8
打印 上一主题 下一主题

[学习教程] 使用sql查询视图中一切援用的表

[复制链接]
飘飘悠悠 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:07:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
MySQL最初的开发者的意图是用mSQL和他们自己的快速低级例程(ISAM)去连接表格。经过一些测试后,开发者得出结论:mSQL并没有他们需要的那么快和灵活。我们界说的视图,基础上就是把多个表的了局依照必定的划定规矩团结查询出来了局,大概是在视图使用函数对数据举行处置等。那末我们要怎样把把视图中所援用的这些表啊函数的都查出来呢?固然,使用sp_helptext打印出视图的界说也是一览无余了。本章我们解说另外一个办法,使用sql查询出视图中所援用的一切工具。

该办法必要用到目次视图sys.sql_dependencies对在界说另外一援用工具的Transact-SQL表达式或语句中援用的被援用的实体的每依附干系,城市在该视图中存在对应的一行,也就是说,在视图中每援用了一个表大概别的工具,城市在这个目次视图中存在一行数据。

使用sys.sql_dependencies目次视图,完成查询出视图中一切工具的办法以下:

1、猎取一切视图的一切援用工具
publicstaticDataTableGetReferencedView()
{
using(SqlConnectionconn=SqlConn())
{
conn.Open();

stringsql=@"selectA.name,A.referencedname,B.typefrom
(
selectdistinctB.name,object_name(A.referenced_major_id)asreferencedname
fromsys.sql_dependenciesA
innerjoinsys.viewsB
onA.object_id=B.object_id
)Ainnerjoinsys.objectsBonA.referencedname=B.NameorderbyA.nameasc";

using(SqlCommandcmd=InitSqlCommand(conn,sql))
{
returnQuery(cmd).Tables[0];
}
}
}


2、猎取指定视图的一切援用工具
publicstaticDataTableGetReferencedView(stringviewname)
{
using(SqlConnectionconn=SqlConn())
{
conn.Open();

stringsql=@"
select@viewnameasname,
nameasreferencedname,
type
fromsys.objects
wherenamein(
selectdistinctobject_name(referenced_major_id)asreferencedname
fromsys.sql_dependencies
whereobject_id=object_id(@viewname)
)";
SqlParameter[]parame={newSqlParameter("@viewname",SqlDbType.VarChar,50)};
parame[0].Value=viewname;

using(SqlCommandcmd=InitSqlCommand(conn,sql,parame))
{
returnQuery(cmd).Tables[0];
}
}
}


假如对下面sql不睬解的,能够参考上面sys.sql_dependencies列申明来了解。列名申明class标识被援用的实体的类:
0=工具或列(仅非架构绑定援用)
1=工具或列(架构绑定援用)
2=范例(架构绑定援用)
3=XML架构汇合(架构绑定援用)
4=分区函数(架构绑定援用)class_desc被援用的实体的类的申明:
OBJECT_OR_COLUMN_REFERENCE_NON_SCHEMA_BOUND
OBJECT_OR_COLUMN_REFERENCE_SCHEMA_BOUND
TYPE_REFERENCE
XML_SCHEMA_COLLECTION_REFERENCE
PARTITION_FUNCTION_REFERENCEobject_id援用工具的ID。column_id假如援用ID是一列,则为援用列的ID;不然为0。referenced_major_id被援用的实体的ID,由类的值注释,详细以下:
0、1=工具或列的工具ID。
2=范例ID。
3=XML架构汇合ID。referenced_minor_id被援用实体的Minor-ID,由类的值注释,以下所示:
当class=:
0,referenced_minor_id为列ID;假如不是列,则为0。
1,referenced_minor_id为列ID;假如不是列,则为0。
不然,referenced_minor_id=0。is_selected选中了工具或列。is_updated更新了工具或列。is_select_all工具用在了SELECT*子句中(仅限工具级)。php本地模拟的prepare底层就是mysql_real_escape_string,所以必须得用mysql_set_character_set去设置mysql->charset,否则就存在字符集问题。
第二个灵魂 该用户已被删除
沙发
发表于 2015-1-18 12:08:35 | 只看该作者
这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
变相怪杰 该用户已被删除
板凳
发表于 2015-1-25 23:34:17 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
若相依 该用户已被删除
地板
发表于 2015-2-4 13:55:18 | 只看该作者
个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。
蒙在股里 该用户已被删除
5#
发表于 2015-2-10 01:48:45 | 只看该作者
groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
老尸 该用户已被删除
6#
发表于 2015-2-28 16:33:40 | 只看该作者
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-10 04:10:40 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
谁可相欹 该用户已被删除
8#
发表于 2015-3-17 05:08:59 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
兰色精灵 该用户已被删除
9#
发表于 2015-3-23 21:37:29 | 只看该作者
入门没那么困难,精通没那么容易
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-27 19:44

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表