SQL Server多表查询的一种方法

1 篇文章 0 订阅
1 篇文章 0 订阅

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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值