• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

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

发布: 2007-7-02 11:08 | 作者: admin | 来源: | 查看: 12次 | 进入软件测试论坛讨论

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


  /// <summary>
  /// 分析视图的sql语句,得到某字段对应的基表和基表字段
  /// </summary>
  /// <param name="viewSql">视图的create view 语句</param>
  /// <param name="viewColumn">要分析的视图字段</param>
  /// <param name="sourceTable">要分析的视图字段所属的源表(或视图)</param>
  /// <param name="sourceColumn">要分析的视图字段在源表或视图中的字段名称</param>
  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

 

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网