转载:http://tuqiang9999.blog.163.com/blog/static/332413201036101137645/
前提,数据库每天会新建一张表,由于数据量非常大,表的数据结构是一样的。
下面这个存储过程是返回一条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
这个存储过程在对会大数据量的时候,大系统利用分表来处理数据量的时候非常有用。