使用数据2分处理的通用分页存储过程 前半部分与后半部分数据访问时间相同,同等访问速度提高一倍

来源:互联网 发布:java基本数据类型存储 编辑:程序博客网 时间:2024/05/16 05:36
--/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/
--
/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/
--
/*-----存储过程 分页处理  2005-04-21修改 添加Distinct查询功能-------*/
--
/*-----存储过程 分页处理  2005-05-18修改 多字段排序规则问题-------*/
--
/*-----存储过程 分页处理  2005-06-15修改 多字段排序修改-------*/
ALTER PROCEDURE dbo.proc_ListPage
(
@tblName     nvarchar(200),        ----要显示的表或多个表的连接
@fldName     nvarchar(500= '*',    ----要显示的字段列表
@pageSize    int = 1,        ----每页显示的记录个数
@page        int = 10,        ----要显示那一页的记录
@pageCount    int = 1 output,            ----查询结果分页后的总页数
@Counts    int = 1 output,                ----查询到的记录数
@fldSort    nvarchar(200= null,    ----排序字段列表或条件
@Sort        bit = 0,        ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
@strCondition    nvarchar(1000= null,    ----查询条件,不需where
@ID        nvarchar(150),        ----主表的主键
@Dist                 bit = 0           ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
)
AS
SET NOCOUNT ON
Declare @sqlTmp nvarchar(1000)        ----存放动态生成的SQL语句
Declare @strTmp nvarchar(1000)        ----存放取得查询结果总数的查询语句
Declare @strID     nvarchar(1000)        ----存放取得查询开头或结尾ID的查询语句

Declare @strSortType nvarchar(10)    ----数据排序规则A
Declare @strFSortType nvarchar(10)    ----数据排序规则B

Declare @SqlSelect nvarchar(50)         ----对含有DISTINCT的查询进行SQL构造
Declare @SqlCounts nvarchar(50)          ----对含有DISTINCT的总数查询进行SQL构造


if @Dist  = 0
begin
    
set @SqlSelect = 'select '
    
set @SqlCounts = 'Count(*)'
end
else
begin
    
set @SqlSelect = 'select distinct '
    
set @SqlCounts = 'Count(DISTINCT '+@ID+')'
end


if @Sort=0
begin
    
set @strFSortType=' ASC '
    
set @strSortType=' DESC '
end
else
begin
    
set @strFSortType=' DESC '
    
set @strSortType=' ASC '
end



--------生成查询语句--------
--
此处@strTmp为取得查询结果数量的语句
if @strCondition is null or @strCondition=''     --没有设置显示条件
begin
    
set @sqlTmp =  @fldName + ' From ' + @tblName
    
set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName
    
set @strID = ' From ' + @tblName
end
else
begin
    
set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition
    
set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition
    
set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition
end

----取得查询结果总数量-----
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
declare @tmpCounts int
if @Counts = 0
    
set @tmpCounts = 1
else
    
set @tmpCounts = @Counts

    
--取得分页总数
    set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize

    
/**//**当前页大于总页数 取最后一页**/
    
if @page>@pageCount
        
set @page=@pageCount

    
--/*-----数据分页2分处理-------*/
    declare @pageIndex int --总数/页大小
    declare @lastcount int --总数%页大小 

    
set @pageIndex = @tmpCounts/@pageSize
    
set @lastcount = @tmpCounts%@pageSize
    
if @lastcount > 0
        
set @pageIndex = @pageIndex + 1
    
else
        
set @lastcount = @pagesize

    
--//***显示分页
    if @strCondition is null or @strCondition=''     --没有设置显示条件
    begin
        
if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理
            begin 
                
set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                        
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1as Varchar(20)) +' '+ @ID +' from '+@tblName
                        
+' order by '+ @fldSort +' '+ @strFSortType+')'
                        
+' order by '+ @fldSort +' '+ @strFSortType 
            
end
        
else
            
begin
            
set @page = @pageIndex-@page+1 --后半部分数据处理
                if @page <= 1 --最后一页数据显示
                    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                        
+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
                
else                
                    
set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                        
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
                        
+' order by '+ @fldSort +' '+ @strSortType+')'

                        
+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
            
end
    
end

    
else --有查询条件
    begin
        
if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理
        begin 
                
set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName +' from  '+@tblName
                    
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1as Varchar(20)) +' '+ @ID +' from '+@tblName
                    
+' Where (1>0) ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType+')'
                    
+' ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType                 
        
end
        
else
        
begin 
            
set @page = @pageIndex-@page+1 --后半部分数据处理
            if @page <= 1 --最后一页数据显示
                    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                        
+' where (1>0) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType
            
else
                    
set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                        
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
                        
+' where (1>0) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+')'
                        
+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
        
end    
    
end

------返回查询结果-----
exec sp_executesql @strTmp
--print @strTmp
SET NOCOUNT OFF

由于项目使用的GUID为主键字段,这里使用了not in这样的查询
有兴趣的朋友可以在使用自增张int类型数据是换成 select top id ... where id > .....
这样的模式 进一步提高性能

下面是传递的参数的简单例子

comm.Parameters.Add("@tblName","VIEW_ST_CDList");
comm.Parameters.Add(
"@fldName","id,cdtitle,cdlanguage,addtime,cdsinger,cdstyle,cdreadme,cdphotopath");
comm.Parameters.Add(
"@pageSize",4);
comm.Parameters.Add(
"@page",page);
comm.Parameters.Add(
"@fldSort","ID");
comm.Parameters.Add(
"@Sort",1);
comm.Parameters.Add(
"@strCondition",strFilter);
comm.Parameters.Add(
"@ID","ID");
comm.Parameters.Add(
"@Counts",SqlDbType.Int,0);
comm.Parameters[
"@Counts"].Direction = ParameterDirection.Output;
comm.Parameters.Add(
"@pageCount",SqlDbType.Int,0);
comm.Parameters[
"@pageCount"].Direction = ParameterDirection.Output;
conn.Open();            
rptDataList.DataSource 
= comm.ExecuteReader();
rptDataList.DataBind();
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 安置房产权到期怎么办 安置房怎么办房产证吗 美甲后指甲长了怎么办 在菲律宾怎么办持枪证? 绝地求生打不准怎么办 身份证号码变更后社保怎么办 社保与身份不符怎么办 年龄改了学籍怎么办 结婚证信息错误怎么办 六级身份证过期怎么办 身份号泄露了怎么办 身体证信息泄露怎么办 手机号被泄漏了怎么办 姓名和电话泄露怎么办 个人身份证信息泄露怎么办 身份号码泄露了怎么办 我身份证泄露了怎么办 身份证信息泄漏了怎么办 无锡身份证丢了怎么办 人在外地怎么办身份证 欠空放公司不还怎么办 兼职要身份证照片怎么办 身份证刷不了磁怎么办 身份证不能刷了怎么办 身份证指纹错了怎么办 指纹手机丢了怎么办 异地办理临时身份证怎么办 杭州办理外地身份证怎么办 办理身份证没有户口本怎么办 2018身份证掉了怎么办 双户口注销社保怎么办 常用户口被注销怎么办 刚到厦门怎么办身份证 新疆身份证丢了怎么办 技能证书丢了怎么办 16岁拍身份证怎么办 16岁以下怎么办身份证 办身份证要证明怎么办 15岁怎么办银行卡淘宝 满16岁怎么办银行卡 电脑最小化后不见了怎么办