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