Form Now On...

导航

 

转载: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

这个存储过程在对会大数据量的时候,大系统利用分表来处理数据量的时候非常有用。

posted on 2011-09-20 09:07  zjwei55  阅读(668)  评论(0编辑  收藏  举报