宁海在线

 找回密码
 立即注册

QQ登录

只需一步,快速开始

快捷登录

客服电话:0574-65520000
搜索
查看: 1953|回复: 1

[软件] 使用存储过程实现分页功能

[复制链接]

54

主题

453

帖子

3566

积分

Lv.9 状元

Rank: 9Rank: 9Rank: 9

积分
3566
在线时间
481 小时
发表于 2010-2-18 19:15:47 | 显示全部楼层 |阅读模式 | 来自浙江
Create PROCEDURE [dbo].[up_DataPager]
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 排序的字段名,一般为唯一标识
@strGetFields varchar(1000) = ' * ', -- 需要返回的列  
@PageSize int = 10, -- 每页有多少条记录
@PageIndex int = 1, -- 第几页
@Count int output, -- 返回记录总数
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = ' 1=1 ' -- 查询条件 (注意: 不要加 where,初始化为1=1使得查询条件永远不为空)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
declare @sumsql nvarchar(3000) -- 记录总数
--执行总数统计。
set @sumsql = 'select @Count = count(*) from '+@tblname +' where '+@strwhere
exec sp_executesql @sumsql,N'@Count int output',@Count output-- 纪录总数
--如果@OrderType不是0,就执行降序
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
--如果是第一页就执行以下代码,加快执行速度
if @PageIndex = 1
  set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '
  from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
else
  --以下代码赋予了@strSQL以真正执行的SQL代码 
  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
exec (@strSQL)
GO
-- =============================================
-- 使用RowNumber分页
-- 参数
--       {
--        @SQL           :    查询语句
--        @Order         :    排序字段
--        @CurPage       :    当前页
--        @PageRows      :    每页大小
--        @TotalRecorder :    记录总数
--       }
-- =============================================
CREATE PROCEDURE [dbo].[up_DataPageRowNumber]
    -- Add the parameters for the stored procedure here
    @SQL Nvarchar(2000),
    @Order Nvarchar(20),
    @PageIndex int,
    @PageSize int,
    @TotalRecorder int output
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    SET NOCOUNT ON;
    declare @ExceSQL nvarchar(4000)
   
    --设置开始行号
    declare  @start_row_num AS int
    SET @start_row_num = (@PageIndex - 1) * @PageSize + 1
    --设置结束行号
    declare @end_row_num int
    set @end_row_num = @PageIndex * @PageSize
   
    --设置标识语句
    declare @RowNumber nvarchar(100)
    set @RowNumber = ', ROW_NUMBER() OVER(ORDER BY ' + @Order + ') as RowNumber from '

    set @SQL = Replace(@SQL,' from ',@RowNumber)
    --获取记录总数
    set @ExceSQL = 'select @TotalRecorder=max(RowNumber) from (' + @SQL + ') as tmp'
    execute sp_executesql @ExceSQL,N'@TotalRecorder int output',@TotalRecorder output
    --设置查询语句
    set @ExceSQL = 'select * from (' + @SQL + ') as tmp where RowNumber between ' + Convert(nvarchar,@start_row_num)
        + ' And ' + Convert(nvarchar, @end_row_num)
    execute(@ExceSQL)
END
GO

/*********************************************************  
* 作    用:数据分页(完整SQL分页存储过程(支持多表联接))
* 使用说明:
    1、单表调用方法:EXEC up_DataPagerCommon @tblName = 'ipa',@fldName = '*',@pageSize =50,@page = 6789,@fldSort = '',@Sort = 1,@strCondition = '',@ID = 'id',@Dist = 0,@pageCount = null,@Counts = NULL
    2、多表调用方法:EXEC up_DataPagerCommon @tblName = 'Info LEFT JOIN InfoType it ON it.typeid=Info.tid',@fldName = 'info.*,it.tname',@pageSize =50,@page = 1806,@fldSort = '',@Sort = 0,@strCondition = '',@ID = 'id',@Dist = 0,    @pageCount = null,@Counts = NULL   
* 多表联合查询使用需注意:1、多表中的主键字段不能为相同的名称。2、多表中不能允许具有相同名称的字段,如果存在相同名称的字段你可以使用AS重命名
*********************************************************/  
CREATE PROCEDURE [dbo].[up_DataPagerCommon]  
(  
@tblName     nvarchar(200),        ----要显示的表或多个表的连接  
@fldName     nvarchar(500) = '*',    ----要显示的字段列表  
@pageSize    int = 10,        ----每页显示的记录个数  
@page        int = 1,        ----要显示那一页的记录  
@fldSort    nvarchar(200) = null,    ----排序字段列表或条件  
@Sort        bit = 0,        ----排序方法,1为升序,0为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')  
@strCondition    nvarchar(1000) = null,    ----查询条件,不需where  
@ID        nvarchar(150),        ----主表的主键  
@Dist      bit = 0,           ----是否添加查询字段的 DISTINCT 默认0不添加/1添加  
@pageCount    int = 1 output,            ----查询结果分页后的总页数  
@Counts    int = 1 output                ----查询到的记录数  
)  
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(0)'  
end  
else  
begin  
     set @SqlSelect = 'select distinct '  
     set @SqlCounts = 'Count(DISTINCT '+@ID+')'  
end  
   
   
if @Sort=0  
begin  
     set @strFSortType=' DESC '  
     set @strSortType=' DESC '  
end  
else  
begin  
     set @strFSortType=' ASC '  
     set @strSortType=' ASC '  
end  
   
if(@fldSort is not null and @fldSort<>'')
begin
    set @fldSort=','+@fldSort
end
else
begin
    set @fldSort=' '
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  
  
--为配合显示  
--set nocount off  
--select @page curpage,@pageSize pagesize,@pageCount countpage,@tmpCounts [Rowcount]  
--set nocount on  
  
  --//***显示分页  
     if @strCondition is null or @strCondition=''     --没有设置显示条件  
     begin  
         if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理  
             begin   
                 if @page=1  
                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName                          
                         +' order by '+ @ID+' '+ @strFSortType+@fldSort
                 else  
                 begin                     
                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName  
                         +' where '+@ID  
                     if @Sort=0  
                        set @strTmp = @strTmp + '>(select max('  
                     else  
                        set @strTmp = @strTmp + '<(select min('  
                     set @strTmp = @strTmp + @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName  
                         +' order by '+ @ID+' '+ @strFSortType+@fldSort+') AS TBMinID)'  
                         +' order by '+ @ID+' '+ @strFSortType+@fldSort
                 end      
             end  
         else  
               
             begin  
             set @page = @pageIndex-@page+1 --后半部分数据处理  
                 if @page <= 1 --最后一页数据显示              
                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(40))+' '+ @fldName+' from '+@tblName  
                         +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort
                 else  
                     begin  
      set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName  
                         +' where '+@ID  
                         if @Sort=0  
                            set @strTmp=@strTmp+' <(select min('  
                         else  
                            set @strTmp=@strTmp+' >(select max('  
      set @strTmp=@strTmp+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName  
                         +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TBMaxID)'  
                         +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort
                    end  
             end  
   
     end  
   
     else --有查询条件  
     begin  
         if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理  
         begin  
                 if @page=1  
                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName                          
                         +' where 1=1 ' + @strCondition + ' order by '+ @ID+' '+ @strFSortType+@fldSort
                 else  
                 begin                     
                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName  
                         +' where '+@ID  
                     if @Sort=0  
                        set @strTmp = @strTmp + '>(select max('  
                     else  
                        set @strTmp = @strTmp + '<(select min('  
   
                  set @strTmp = @strTmp + @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName  
                         +' where (1=1) ' + @strCondition +' order by '+ @ID+' '+ @strFSortType+@fldSort+') AS TBMinID)'  
                         +' '+ @strCondition +' order by '+ @ID+' '+ @strFSortType+@fldSort
                 end              
         end  
         else  
         begin   
             set @page = @pageIndex-@page+1 --后半部分数据处理  
             if @page <= 1 --最后一页数据显示  
                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(40))+' '+ @fldName+' from '+@tblName  
                         +' where (1=1) '+ @strCondition +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort                     
             else  
                   begin  
                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName  
                         +' where '+@ID  
                     if @Sort=0  
                        set @strTmp = @strTmp + '<(select min('  
                     else  
                        set @strTmp = @strTmp + '>(select max('  
                set @strTmp = @strTmp + @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName  
                         +' where (1=1) '+ @strCondition +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TBMaxID)'  
                         +' '+ @strCondition+' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort  
                  end               
         end      
     
     end  
   
------返回查询结果-----  
SET NOCOUNT off  
exec sp_executesql @strTmp  
print @strTmp  
GO


使用存储过程实现分页功能相对可以减少不必要的内存开销

想学web开发可以联系我 QQ  56681994
下载宁海在线客户端

14

主题

136

帖子

741

积分

Lv.3 平民

Rank: 3Rank: 3

积分
741
在线时间
1677 小时
发表于 2010-5-13 10:19:55 | 显示全部楼层 | 来自河南
实在忍不住了,留名!看到抢贴,貌
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|客户端|浙公网安备案 33022602000116|宁海在线 ( 浙B2-20200368

关于我们|电话:0574-65520000 ,GMT+8, 2024-11-23 20:56 , Processed in 0.086509 second(s), 23 queries , Apc On.

Powered by Discuz! X3.4

© 2000-2015 NHZJ Inc.

违法和不良信息举报电话:13819844444  邮箱:admin@nhzj.com
 未成年人保护服务电话:13819844444  邮箱:admin@nhzj.com
快速回复 返回顶部 返回列表