分表查询(存储过程) (转)

前提,数据库每天会新建一张表,由于数据量非常大,表的数据结构是一样的。

下面这个存储过程是返回一条SQL语句的。

我们传入的是两个时间,得到的是查询这段时间内的数据的一个SQL语句。

Create Procedure Search

@date1 datetime, --起始时间

@date2 datetime --终止时间

as

declare @date1New datetime,

@rq varchar(6),

@i int , --记录循环次数

@s varchar(5000) --根据表多少 可以扩大它

set @rq = convert(varchar,@date1,12)--把时间格式化,比如2008-06-20变成080620

--set @rq = select convert(varchar,@date1,12)是完全错误的,select的作用是显示,不是传值

set @s = 'select * from MainTable' + @rq --初始化@s='select * from MainTable080620' 这样第一个表就有了

set @i = datediff(d,@date1,@date2) --日期相减,按日计算

while @i > 0

begin

--如果是非常重要的系统可以在这里加上该物理表是否存在的语句

--以下是对于2000来讲,2008已经不存在于这个系统表里面了。其中IsUserTable是指表名。

--sql2000

--if exist( select * from dbo.sysobjects where id = object_id(N'c') and OBJECTPROPERTY(id,N'IsUserTable')=1)

--sql2008

--if exist( select * from dbo.sysobjects where name='IsUserTable')

--begin

--select '存在'

--end

--else

--begin

--select '不存在'

--end

set @date1New = dateadd(day,@i,@date1)

set @rq=convert(varchar,@date1New,12)

--如果是按月进行查询就修改上面,把d改成m

set @s = @s + 'union all select * from MainTable' + @rq

set @i = @i -1 --累加

end

select @s

end

例如:我们的表名叫作:MainTable+yymmdd,如MainTable100406,MainTable100407。。。

那么当我们传入2010-04-06和2010-04-08,那么这个存储成功执行之后的结果会是:

select * from MainTable100406

union all

select * from MainTable100407

这个存储过程在对会大数据量的时候,大系统利用分表来处理数据量的时候非常有用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值