SQL Server多表查询的一种方法

来源:互联网 发布:学日语软件 编辑:程序博客网 时间:2024/05/07 15:20

这个应用背景是这样的,应用软件按天自动生成表,格式为表名+日期,在查找时需要从多张表中取出数据(仅仅查找,无需修改),考虑到在MS 的SQL Server系统表sysobjects中保存了数据库中所有表的表名,我们可以从中找出所需查询的表,生成一张临时视图进行查找,视图中包含所需信息,即两个时间段内的数据。


CString CInquireDlg::CreateTempView(CString tbname){//tbname为要创建视图的表名头部分CString TempSql,Tablename;CTime Temptime;int flag,i;m_span=m_tDateEnd-m_tDateBegin;m_totaldays=m_span.GetDays();Temptime=m_tDateBegin;TempSql="create view tbl_TempView as select * from ";///跳过前面不存在的表flag=0;Tablename=tbname+Temptime.Format("%Y%m%d");//生成日期对应的表名m_filter=m_pencaADO->GetRecordSet("SELECT * FROM sysobjects WHERE name='"+(bstr_t)Tablename+"'");//查询记录while(m_filter->adoEOF == VARIANT_TRUE && flag<m_totaldays){flag++;Temptime=Temptime+CTimeSpan(1,0,0,0);//日期递增Tablename=tbname+Temptime.Format("%Y%m%d");//生成日期对应的表名m_filter=m_pencaADO->GetRecordSet("SELECT * FROM sysobjects WHERE name='"+(bstr_t)Tablename+"'");//查询记录}if (m_filter->adoEOF != VARIANT_TRUE){TempSql=TempSql+tbname+Temptime.Format("%Y%m%d");//生成视图的第一个表}else return "tbl_ERROR";//如果第一张表都不存在则说明查询范围内没有表,则返回tbl_ERROR////////////////////////////////////////////////////////////////对第二张以后的表进行处理for (i=flag;i<=m_totaldays;i++){Tablename=tbname+Temptime.Format("%Y%m%d");//生成日期对应的表名m_filter=m_pencaADO->GetRecordSet("SELECT * FROM sysobjects WHERE name='"+(bstr_t)Tablename+"'");//查询记录if(m_filter->adoEOF != VARIANT_TRUE)//判断是否空集,跳过不存在的表{TempSql=TempSql+" union select * from "+Tablename;}Temptime=Temptime+CTimeSpan(1,0,0,0);//日期递增}    m_pencaADO->ExecuteSQL((_bstr_t)TempSql);//用多张表生成一个查询视图return "tbl_TempView";//返回创建的临时视图名字}