• 水平分表查询(存储过程)


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

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

  • 相关阅读:
    可执行程序的装载
    stdafx.h的作用
    AI调色板
    3ds max输出图片
    3ds max移除几何体的线段
    3ds max删除了对象后,还是将原来所有对象输出的原因
    vs win32 & MFC 指针默认位置
    3ds max 分离对象
    PDF
    endnote设置文献第二行悬挂缩进办法
  • 原文地址:https://www.cnblogs.com/zjwei55/p/2182073.html
Copyright © 2020-2023  润新知