利用C#查询视图字段基于基表的字段

原创 2004年07月20日 00:06:00

?????? 在SQL Server 2000里,通过sysdepends,syscolumns等这些系统表无法找到多层次视图的最基底表字段依赖,特别是在视图采用别名的时候。但在某些环境下,软件系统又希望达到这个目的,所以只好采用在逻辑过程中分析的思路了,这样做,无疑效率是比较低的,但却是一种实现的方法。提供的这段代码的思路是,分析视图的create view .. as select ...from ...这个语句,截取select 和from 之间这段来进行处理,然后找到如dbo.YourTableOrView.YourColumn (AS XXX) 之类的那一段,再进行进一步分析取到 YourTableOrView以及YourColumn.这样,再判断这个YourTableOrView是视图还是表,如果是表,则说明已经找到,如果是视图,则再调用这个过程来递归分析,一直分析到表为止。当然,在这里还要考虑一些视图的复杂性,比如字段是一个常量,或者是一个计算列,等等没有基表字段对应的情况,这个在具体写应用的时候,注意一下即可了。?

?///
??/// 分析视图的sql语句,得到某字段对应的基表和基表字段
??///
??/// 视图的create view 语句
??/// 要分析的视图字段
??/// 要分析的视图字段所属的源表(或视图)
??/// 要分析的视图字段在源表或视图中的字段名称
??private bool AnalyseViewsColumns(string viewSql,string viewColumn,out string sourceTable,out string sourceColumn)
??{
???viewSql = viewSql.Replace("/r/n",string.Empty);
???string sp ="FROM";
???string sql =viewSql.Substring(0,viewSql.IndexOf(sp));
???sp="SELECT";
???sql = sql.Substring(sql.IndexOf(sp)+6);

///以上这几步是为了把这个sql 弄"干净"一些,只对select 和 from 之间进行分析。
???string[] tsql2=sql.Split(',');
???foreach(string t in tsql2)
???{
????if(t.IndexOf(viewColumn)!=-1)
????{
?????sql=t;
?????break;
????}
???}

////以上这几步取到那个包含viewColumn的 一段 类似 dbo.YourTableOrView.YourColumn (AS XXX)的字符串,放在sql中。以下通过'.'把sql 分成三段,进一步分析。
???string[] tsql3 = sql.Split('.');
???if(tsql3.Length!=3)? ///如果不是这种三段式的,就返回(说明是一些常量列啊,等等)
???{
????sourceTable=string.Empty;
????sourceColumn=string.Empty;
????return false;
???}
???else
???{
????sourceTable=tsql3[1];
????if(tsql3[2].IndexOf(" AS ")!=-1)? //如果有AS ,即是有别名的
????{
?????sp = " AS ";
?????sourceColumn = tsql3[2].Remove(tsql3[2].IndexOf(sp),tsql3[2].Length-tsql3[2].IndexOf(sp));
????}
????else
????{
?????sourceColumn = tsql3[2].Trim();
????}
????return true;
???}
??}

?

OK了:)

在研究这个问题的过程中,得到了 zjcxc(邹建) 大侠的帮助。在这里谢过了:)

相关的贴子在:

http://community.csdn.net/Expert/topic/3186/3186099.xml?temp=.5037653

?

因祸得福——创建视图时改变字段的类型

在数据库中创建视图时,将字段从A类型转换为B类型,只需要一个convert或cast就可以...
  • WKX18330698534
  • WKX18330698534
  • 2016年04月08日 21:10
  • 1700

Hibernate高效查询,只查询部分/指定字段

公司使用 DetachedCriteria detachedCriteria = DetachedCriteria.forClass(PeBulletin.class); detachedCrite...
  • yaerfeng
  • yaerfeng
  • 2013年01月17日 16:24
  • 28880

mysql查询表和 视图信息

查询表名  SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'asdb'; 查询视图名 ...
  • Fupengyao
  • Fupengyao
  • 2016年03月21日 17:49
  • 1217

hibernate利用关联关系查询对象

利用关联关系操纵对象 数据对象之间关联关系有一对一、一对多及多对多关联关系。在数据库操作中,数据对象之间的关联关系使用JDBC处理很困难。本节讲解如何在Hibernate中处理这些对象之间的关联关系...
  • s592652578
  • s592652578
  • 2014年10月23日 14:52
  • 597

mongodb中根据集合中的字段关系返回查询结果

在工作中同事遇到个问题问我,我竟然一时还真不知道怎么处理,问题如下所示: 描述:有个积分表,用于记录用户的一些积分情况,其中有两个字段,score用于记录用户当前积分,totalscore用于记录用...
  • andamajing
  • andamajing
  • 2016年10月25日 14:31
  • 2067

视图与冗余物理表的查询性能测试

如果有30张表,他们各自有各自的自定义字段,也有一部分公有字段;需要将公有字段归一起来统一查询,一般而言有两种方式: 1.公共字段物理表 数据在入库/更新时,更新自己的表的数据,同时亦将数据更新入公共...
  • rongyongfeikai2
  • rongyongfeikai2
  • 2016年05月24日 10:11
  • 1773

Hibernate hql 查询指定字段并获取结果集

Hibernate hql 查询指定字段并获取结果集 在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况: 1.查...
  • zhbitxhd
  • zhbitxhd
  • 2013年05月21日 21:16
  • 35678

MySQL中的数据类型,列选项,视图

列的数据类型 整型 小数类型 浮点类型 位类型 字符串类型 日期类型 二进制大对象类型 数字列上的列选项 临时表 CTAS举例 根据已有的表创建新表 default 表选项 约束非空主键唯一键 约束的...
  • qq_18312025
  • qq_18312025
  • 2017年11月08日 21:01
  • 101

v$sql视图字段解释

SQL_TEXT:SQL文本的前1000个字符 SHARABLE_MEM:占用的共享内存大小(单位:byte) PERSISTENT_MEM:生命期内的固定内存大小(单位:byte) RUNTI...
  • mjj291268154
  • mjj291268154
  • 2014年08月25日 17:19
  • 1018

深入理解c#的字段与属性

属性属性的作用就是保护字段,对字段的赋值和取值进行限定 属性的本质就是两个方法,一个叫get()对取值进行限定,一个叫set()对存值进行限定,属性只是对属性的再赋值。 如果只有get是只读属性,...
  • zhzz2012
  • zhzz2012
  • 2015年05月19日 10:59
  • 4350
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用C#查询视图字段基于基表的字段
举报原因:
原因补充:

(最多只允许输入30个字)