SQL Server多表查询的一种方法

这个应用背景是这样的,应用软件按天自动生成表,格式为表名+日期,在查找时需要从多张表中取出数据(仅仅查找,无需修改),考虑到在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 && flagGetRecordSet("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";//返回创建的临时视图名字

}


你可能感兴趣的:(sql,server,数据库,MFC,SQL,数据库,MFC)