.Net设计 发表于 2010-2-18 19:15:47

使用存储过程实现分页功能

Create PROCEDURE .
@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 .
    -- 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 .
(
@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
--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开发可以联系我 QQ56681994

你们畅 发表于 2010-5-13 10:19:55

实在忍不住了,留名!看到抢贴,貌
页: [1]
查看完整版本: 使用存储过程实现分页功能