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

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

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


  ///<summary>
  ///分析视图的sql语句,得到某字段对应的基表和基表字段
  ///</summary>
  ///<paramname="viewSql">视图的createview语句</param>
  ///<paramname="viewColumn">要分析的视图字段</param>
  ///<paramname="sourceTable">要分析的视图字段所属的源表(或视图)</param>
  ///<paramname="sourceColumn">要分析的视图字段在源表或视图中的字段名称</param>
  privateboolAnalyseViewsColumns(stringviewSql,stringviewColumn,outstringsourceTable,outstringsourceColumn)
  {
   viewSql=viewSql.Replace("/r/n",string.Empty);
   stringsp="FROM";
   stringsql=viewSql.Substring(0,viewSql.IndexOf(sp));
   sp="SELECT";
   sql=sql.Substring(sql.IndexOf(sp)+6);

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

////以上这几步取到那个包含viewColumn的一段类似dbo.YourTableOrView.YourColumn(ASXXX)的字符串,放在sql中。以下通过'.'把sql分成三段,进一步分析。
   string[]tsql3=sql.Split('.');
   if(tsql3.Length!=3) ///如果不是这种三段式的,就返回(说明是一些常量列啊,等等)
   {
    sourceTable=string.Empty;
    sourceColumn=string.Empty;
    returnfalse;
   }
   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();1 <script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
阅读更多
文章标签: tsql sql string
个人分类: 数据库
上一篇★2005Express文档和示例发布
下一篇DBA工作备忘录之三:rman备份,未使用catalog,控制文件丢失的解决办法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭