SQL大量数据查询分页存储过程

/*     
   经测试,在 14483461 条记录中查询第 100000 页,每页 10 条记录按升序和降序第一次时间均为 0.47 秒,第二次时间均为 0.43 秒,测试语法如下:     
   exec GetRecordFromPage news,newsid,10,100000     
   news 为 表名, newsid 为关键字段, 使用时请先对 newsid 建立索引。     
*/     
/*     
   函数名称: GetRecordFromPage     
   函数功能: 获取指定页的数据     
   参数说明: @tblName       包含数据的表名     
            @fldName       关键字段名     
            @PageSize      每页记录数     
            @PageIndex     要获取的页码     
            @OrderType     排序类型, 0 - 升序, 1 - 降序     
            @strWhere      查询条件 (注意: 不要加 where)     
   作  者: 紫色形人     
   邮  箱: kissyougoodby@163.com     
   创建时间: 2007-9-27     
修改时间: 2007-9-27*/     
CREATE PROCEDURE GetRecordFromPage     
     @tblName       varchar(255),        -- 表名     
     @fldName       varchar(255),        -- 字段名     
     @PageSize      int = 10,            -- 页尺寸     
     @PageIndex     int = 1,             -- 页码     
     @OrderType     bit = 0,             -- 设置排序类型, 非 0 值则降序     
     @strWhere      varchar(2000) = ''   -- 查询条件 (注意: 不要加 where)     
AS     
declare @strSQL    varchar(6000)        -- 主语句     
declare @strTmp    varchar(1000)        -- 临时变量     
   
declare @strOrder varchar(500)         -- 排序类型     
if @OrderType != 0     
begin     
     set @strTmp = "<(select min"
     set @strOrder = " order by [" + @fldName +"] desc"     
end     
else     
begin     
     set @strTmp = ">(select max"     
     set @strOrder = " order by [" + @fldName +"] asc"     
end     
set @strSQL = "select top " + str(@PageSize) + " * from ["     
     + @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) + " * from ["     
         + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["     
         + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["     
         + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "     
         + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder     
if @PageIndex = 1     
begin     
     set @strTmp = ""     
     if @strWhere != ''     
         set @strTmp = " where (" + @strWhere + ")"     
     set @strSQL = "select top " + str(@PageSize) + " * from ["     
   
+ @tblName + "]" + @strTmp + " " + @strOrder     
end     
exec (@strSQL)
GO
 
转自:http://hi.baidu.com/ecentury/blog/item/4af0454a51ece42908f7ef41.html
posted @ 2011-07-12 07:42  南山放牛  阅读(324)  评论(1编辑  收藏  举报