利用C#查询视图字段基于基表的字段
2008-05-01 02:19
106 查看
在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("",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
/// <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("",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
相关文章推荐
- 利用C#查询视图字段基于基表的字段
- 利用查询视图字段基于基表的字段
- 利用C#实现分布式数据库查询
- MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法
- 利用JQuery方便实现基于Ajax的数据查询、排序和分页功能
- MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法
- mybatis利用example文件进 4000 行异表字段模糊查询
- 利用Oracle物化视图优化项目查询
- 用table+物化视图优化复杂语句中以%开头like特定格式字段查询
- 折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)
- 利用DB字典表查询表格字段定义
- 在基于数据库的任务派发系统中利用SQL Server 2005 新的查询提示来提高系统的效率
- C#利用反射简化给类字段赋值
- 创建视图,查询表空间的利用情况
- 利用C#实现分布式数据库查询
- MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法
- ef core 2.1 利用Query Type查询视图
- sql 查询表/视图字段、字段类型、字段长度
- c#中利用简单枚举和标志枚举(组合,删除,查询是否包含)
- 利用冗余字段解决查询结果排序慢的问题