高效分页存储过程代码,数据库存储过程分页显

时间:2020-04-07 14:23来源:江苏十一选五手机版数据库
注:供给树立目录复制代码 代码如下:/*经测验,在14483461条记下中询问第100000页,每页10条记下按升序和降序第一回时间均为0.47秒,第2回时间均为0.43秒,测试语法如下:execGetRecordFromP

注:供给树立目录复制代码 代码如下:/* 经测验,在14483461条记下中询问第100000页,每页10条记下按升序和降序第一回时间均为0.47秒,第2回时间均为0.43秒,测试语法如下: execGetRecordFromPagenews,newsid,10,100000 news为表名,newsid为主要字段,使用时请先对newsid建构目录。 */ /* 函数名称:GetRecordFromPage 函数功效:获取钦定页的数据 参数表达:@tblName富含数据的表名 @fldName关键字段名 @PageSize每页记录数 @PageIndex要博取的页码 @OrderType排序类型,0-升序,1-降序 @strWhere查询条件(注意:不要加where卡塔尔(قطر‎ 作 者:铁拳 邮 箱:unjianhua_kki@sina.com"sunjianhua_kki@sina.com 成立时间:二零零二-07-04 修改时间:二零零四-07-04 */ CreatePROCEDUREGetRecordFromPage @tblNamevarchar(255卡塔尔(قطر‎,--表名 @fldNamevarchar(255State of Qatar,--字段名 @PageSizeint=10,--页尺寸 @PageIndexint=1,--页码 @OrderTypebit=0,--设置排序类型,非0值则降序 @strWherevarchar(二〇〇〇卡塔尔(قطر‎=''--查询条件(注意:不要加where卡塔尔国 AS declare@strSQLvarchar(6000卡塔尔(قطر‎--主语句 declare@strTmpvarchar(1000State of Qatar--有的时候变量 declare@strOrdervarchar(500)--排序类型 if@OrderType!=0 begin set@strTmp="(selectmin" set@strOrder="orderby["+@fldName+"]desc" end else begin set@strTmp="(selectmax" set@strOrder="orderby["+@fldName+"]asc" end set@strSQL="selecttop"+str(@PageSize)+"*from[" +@tblName+"]where["+@fldName+"]"+@strTmp+"([" +@fldName+"])from(selecttop"+str((@PageIndex-1)*@PageSize)+"[" +@fldName+"]from["+@tblName+"]"+@strOrder+")astblTmp)" +@strOrder if@strWhere!='' set@strSQL="selecttop"+str(@PageSize)+"*from[" +@tblName+"]where["+@fldName+"]"+@strTmp+"([" +@fldName+"])from(selecttop"+str((@PageIndex-1)*@PageSize)+"[" +@fldName+"]from["+@tblName+"]where"+@strWhere+"" +@strOrder+")astblTmp)and"+@strWhere+""+@strOrder if@PageIndex=1 begin set@strTmp="" if@strWhere!='' set@strTmp="where("+@strWhere+")" set@strSQL="selecttop"+str(@PageSize)+"*from[" +@tblName+"]"+@strTmp+""+@strOrder end exec(@strSQL) GO

原帖子如下:

-- 得到内定页的数目
CREATE PROCEDURE pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需求重回的列
@fldName varchar(255卡塔尔国='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 重回记录总的数量, 非 0 值则赶回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500卡塔尔国 = '' -- 查询条件 (注意: 不要加 whereState of Qatar
江苏十一选五手机版,AS

江苏十一选五手机版 1江苏十一选五手机版 2/**//*
江苏十一选五手机版 3 名称:spAll_DeleteNoneUnique
江苏十一选五手机版 4 输入:要查询的表名和字段列表
江苏十一选五手机版 5 输出:
江苏十一选五手机版 6 调用:
江苏十一选五手机版 7 表达:实现相对级数据的分页呈现!--能够在5秒内得到1448万条记下里的第1200页的100条记下,雄不?
江苏十一选五手机版 8 作者:铁拳
江苏十一选五手机版 9 邮件:
江苏十一选五手机版 10 网站:
江苏十一选五手机版 11 更新:20040610
江苏十一选五手机版 12 支持:
江苏十一选五手机版 13 版权:转述时请表明来源:用观念创立现在的Wellknow.net
江苏十一选五手机版 14*/
江苏十一选五手机版 15
江苏十一选五手机版 16CREATE PROCEDURE GetRecordFromPage
江苏十一选五手机版 17    @tblName      varchar(255),       -- 表名
江苏十一选五手机版 18    @fldName      varchar(255),       -- 字段名
江苏十一选五手机版 19    @PageSize     int = 10,           -- 页尺寸
江苏十一选五手机版 20    @PageIndex    int = 1,            -- 页码
江苏十一选五手机版 21    @IsCount      bit = 0,            -- 重回记录总的数量, 非 0 值则赶回
江苏十一选五手机版 22    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
江苏十一选五手机版 23    @strWhere     varchar(1000卡塔尔(قطر‎ = ''  -- 查询条件 (注意: 不要加 whereState of Qatar
江苏十一选五手机版 24AS
江苏十一选五手机版 25
江苏十一选五手机版 26declare @strSQL   varchar(6000)       -- 主语句
江苏十一选五手机版 27declare @strTmp   varchar(100卡塔尔(قطر‎        -- 不经常变量
江苏十一选五手机版 28declare @strOrder varchar(400卡塔尔国        -- 排序类型
江苏十一选五手机版 29
江苏十一选五手机版 30if @OrderType != 0
江苏十一选五手机版 31begin
江苏十一选五手机版 32    set @strTmp = "<(select min"
江苏十一选五手机版 33    set @strOrder = " order by [" + @fldName +"] desc"
江苏十一选五手机版 34end
江苏十一选五手机版 35else
江苏十一选五手机版 36begin
江苏十一选五手机版 37    set @strTmp = ">(select max"
江苏十一选五手机版 38    set @strOrder = " order by [" + @fldName +"] asc"
江苏十一选五手机版 39end
江苏十一选五手机版 40
江苏十一选五手机版 41set @strSQL = "select top " + str(@PageSize) + " * from ["
江苏十一选五手机版 42    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
江苏十一选五手机版 43    + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
江苏十一选五手机版 44    + @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
江苏十一选五手机版 45    + @strOrder
江苏十一选五手机版 46
江苏十一选五手机版 47if @strWhere != ''
江苏十一选五手机版 48    set @strSQL = "select top " + str(@PageSize) + " * from ["
江苏十一选五手机版 49        + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
江苏十一选五手机版 50        + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
江苏十一选五手机版 51        + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
江苏十一选五手机版 52        + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder
江苏十一选五手机版 53
江苏十一选五手机版 54if @PageIndex = 1
江苏十一选五手机版 55begin
江苏十一选五手机版 56    set @strTmp = ""
江苏十一选五手机版 57    if @strWhere != ''
江苏十一选五手机版 58        set @strTmp = " where " + @strWhere
江苏十一选五手机版 59
江苏十一选五手机版 60    set @strSQL = "select top " + str(@PageSize) + " * from ["
江苏十一选五手机版 61        + @tblName + "]" + @strTmp + " " + @strOrder
江苏十一选五手机版 62end
江苏十一选五手机版 63
江苏十一选五手机版 64if @IsCount != 0
江苏十一选五手机版 65    set @strSQL = "select count(*) as Total from [" + @tblName + "]"
江苏十一选五手机版 66
江苏十一选五手机版 67exec (@strSQL)
江苏十一选五手机版 68
江苏十一选五手机版 69GO
江苏十一选五手机版 70
江苏十一选五手机版 71

declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110卡塔尔 -- 临时变量
declare @strOrder varchar(400卡塔尔(قطر‎ -- 排序类型
if @doCount != 0
begin
if @strWhere !=''
set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere
else
set @strSQL = "select count(*) as Total from [" + @tblName + "]"
end
--以上代码的意味是一旦@doCount传递过来的不是0,就推行总额总括。以下的兼具代码都以@doCount为0的状态

更改后,便于使用的代码:

else
begin
if @OrderType != 0
begin
set @strTmp = "<(select min"
set @strOrder = " order by [" + @fldName +"] desc"
--纵然@OrderType不是0,就施行降序,那句十分重大!
end

江苏十一选五手机版 72改良一小点低价别的人使用 
江苏十一选五手机版 73CREATE PROCEDURE GetRecordFromPage 
江苏十一选五手机版 74@tblName varchar(255), -- 表名 
江苏十一选五手机版 75@fldName varchar(255), -- 字段名 
江苏十一选五手机版 76@OrderfldName varchar(255卡塔尔(قطر‎, -- 排序字段名 
江苏十一选五手机版 77@StatfldName varchar(255卡塔尔(قطر‎, -- 计算字段名 
江苏十一选五手机版 78@PageSize int = 10, -- 页尺寸 
江苏十一选五手机版 79@PageIndex int = 1, -- 页码 
江苏十一选五手机版 80@IsCount bit = 0, -- 再次来到记录总的数量, 非 0 值则赶回 
江苏十一选五手机版 81@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 
江苏十一选五手机版 82@strWhere varchar(1000State of Qatar = '' -- 查询条件 (注意: 不要加 where卡塔尔(قطر‎ 
江苏十一选五手机版 83AS 
江苏十一选五手机版 84
江苏十一选五手机版 85declare @strSQL varchar(6000) -- 主语句 
江苏十一选五手机版 86declare @strTmp varchar(100卡塔尔国 -- 有时变量 
江苏十一选五手机版 87declare @strOrder varchar(400卡塔尔(قطر‎ -- 排序类型 
江苏十一选五手机版 88
江苏十一选五手机版 89if @OrderType != 0 
江苏十一选五手机版 90begin 
江苏十一选五手机版 91set @strTmp = "<(select min" 
江苏十一选五手机版 92set @strOrder = " order by [" + @OrderfldName +"] desc" 
江苏十一选五手机版 93end 
江苏十一选五手机版 94else 
江苏十一选五手机版 95begin 
江苏十一选五手机版 96set @strTmp = ">(select max" 
江苏十一选五手机版 97set @strOrder = " order by [" + @OrderfldName +"] asc" 
江苏十一选五手机版 98end 
江苏十一选五手机版 99
江苏十一选五手机版 100set @strSQL = "select top " + str(@PageSize) + " " + @fldName + " from [" 
江苏十一选五手机版 101+ @tblName + "] where [" + @OrderfldName + "]" + @strTmp + "([" 
江苏十一选五手机版 102+ @OrderfldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " [" 
江苏十一选五手机版 103+ @OrderfldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)" 
江苏十一选五手机版 104+ @strOrder 
江苏十一选五手机版 105
江苏十一选五手机版 106if @strWhere != '' 
江苏十一选五手机版 107set @strSQL = "select top " + str(@PageSize) + " " + @fldName + " from [" 
江苏十一选五手机版 108+ @tblName + "] where [" + @OrderfldName + "]" + @strTmp + "([" 
江苏十一选五手机版 109+ @OrderfldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " [" 
江苏十一选五手机版 110+ @OrderfldName + "] from [" + @tblName + "] where " + @strWhere + " " 
江苏十一选五手机版 111+ @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder 
江苏十一选五手机版 112
江苏十一选五手机版 113if @PageIndex = 1 
江苏十一选五手机版 114begin 
江苏十一选五手机版 115set @strTmp = "" 
江苏十一选五手机版 116if @strWhere != '' 
江苏十一选五手机版 117set @strTmp = " where " + @strWhere 
江苏十一选五手机版 118
江苏十一选五手机版 119set @strSQL = "select top " + str(@PageSize) + " " + @fldName + " from [" 
江苏十一选五手机版 120+ @tblName + "]" + @strTmp + " " + @strOrder 
江苏十一选五手机版 121end 
江苏十一选五手机版 122
江苏十一选五手机版 123if @IsCount != 0 
江苏十一选五手机版 124set @strSQL = "select count(" + @StatfldName + ") as Total from [" + @tblName + "]" 
江苏十一选五手机版 125
江苏十一选五手机版 126exec (@strSQL) 
江苏十一选五手机版 127
江苏十一选五手机版 128GO 
江苏十一选五手机版 129

else
begin
set @strTmp = ">(select max"
set @strOrder = " order by [" + @fldName +"] asc"
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" + @tblName + "] where " + @strWhere + " " + @strOrder
else
set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["+ @tblName + "] "+ @strOrder
--如若是率先页就实践以上代码,那样会加紧施行进程
end

说明:
追加了上边五个部分,别的人拷贝去可依靠本人须要实行设定。
@OrderfldName varchar(255卡塔尔, -- 排序字段名
@StatfldName varchar(255卡塔尔国, -- 总计字段名

else
begin
--以下代码授予了@strSQL以真正实行的SQL代码
set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["

fldName效能由排序变换为垄断(monopoly卡塔尔需求开拓的字段。
@fldName varchar(255), -- 字段名

  • @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName
  • "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder
    if @strWhere != ''
    set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["
  • @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
  • @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
  • @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
  • @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder
    end
    end
    exec (@strSQL)
    GO

----------------------------------------------
村办测量试验结果:
经过测量试验,性能并从未原帖子所说的好。但这恐怕是机器原因,要明了,在SQL Server中,2千万条空记录差没多少要私吞3G左右的半空中,而插入那2千万条记下,在自己的测量检验平台上花销了近十叁个钟头,内部存储器占用从125M升高到350M左右。笔者骨子里测量检验了一晃,在建设构造目录的情景下,施行叁遍依执照主人键,重回一条记下的查询,在512M内部存款和储蓄器,2.2G CPU,20G单分区存款和储蓄数据库文件,100M局域网的配置景况下,平均大概须要15s左右(那只是本人的私家测量检验,不持有任何实质性意义。)。

除此以外小编发觉,对于上述配置的机械,运营SQL Server时,在百万等第之下的表中施行查询--(索引杰出,未有坏点,或许最新索引),速度差距超级小,但到达8位数以上,也正是纯属之上时候,SQL Server表现就不太好了,当然,那与机器配置有十分的大关系了。但不容争辩,SQL Server  二零零四还不是百货店级数据库的极品选拔,在Oracle实践肖似的查询,质量要好于SQL Server。插入实践达成的时间是4个小时,内存占用平昔未有生成:400M。试行同一查询,必要的时日是10s左右。

兄弟近年来忙于三个公积金项目,对于部门数据库、宗旨数据库的调解实行了一部分评估,Oracle软件+SUN/HP的硬件依然占了中夏族民共和国行政机关服务器的大部市情,再正是IBM,攻下了高等和甚高档的比非常多作业。

微软在这里上头打个胜仗,还应该有很短的路要走--个人认为,和硬件公司协作研究开发相配套硬件是不二措施。

编辑:江苏十一选五手机版数据库 本文来源:高效分页存储过程代码,数据库存储过程分页显

关键词: