|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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,否则就存在字符集问题。 |
|