zoukankan      html  css  js  c++  java
  • 分页存储过程

      1 USE [database]
      2 GO
      3 /****** Object:  StoredProcedure [dbo].[SP_Com_SelectByPage]    Script Date: 03/03/2014 13:01:19 ******/
      4 SET ANSI_NULLS ON
      5 GO
      6 SET QUOTED_IDENTIFIER ON
      7 GO
      8 ALTER PROCEDURE [dbo].[SP_Com_SelectByPage]
      9 (
     10 @tblName     nvarchar(Max),        ----要显示的表或多个表的连接
     11 @fldName     nvarchar(max) = '*',    ----要显示的字段列表
     12 @pageSize    int = 1,        ----每页显示的记录个数
     13 @page        int = 1,        ----要显示那一页的记录
     14 @fldSort    nvarchar(max) = null,    ----排序字段列表或条件
     15 @Sort        bit = 1,        ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
     16 @strCondition    nvarchar(max) = null,    ----查询条件,不需where
     17 @ID        nvarchar(150),        ----主表的主键
     18 @Dist                 bit = 0           ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
     19 )
     20 AS
     21 SET NOCOUNT ON
     22 Declare @sqlTmp nvarchar(max)        ----存放动态生成的SQL语句
     23 Declare @strTmp nvarchar(max)        ----存放取得查询结果总数的查询语句
     24 Declare @strID     nvarchar(max)        ----存放取得查询开头或结尾ID的查询语句
     25 Declare @pageCount    int             ----查询结果分页后的总页数
     26 Declare @Counts    int                 ----查询到的记录数
     27 Declare @strSortType nvarchar(10)    ----数据排序规则A
     28 Declare @strFSortType nvarchar(10)    ----数据排序规则B
     29 
     30 Declare @SqlSelect nvarchar(max)         ----对含有DISTINCT的查询进行SQL构造
     31 Declare @SqlSelectCount nvarchar(max)
     32 Declare @SqlCounts nvarchar(max)          ----对含有DISTINCT的总数查询进行SQL构造
     33 Declare @FSort     nvarchar(max)
     34 Declare @DSort     nvarchar(max)
     35 set @pageCount=1
     36 set @Counts=1
     37 
     38 if @Dist  = 0
     39 begin
     40     set @SqlSelect = 'select '
     41     set @SqlSelectCount = 'select '
     42     set @SqlCounts = 'Count(*)'
     43 end
     44 else
     45 begin
     46     set @SqlSelect = 'select distinct '
     47     --set @SqlCounts = 'Count(DISTINCT '+@ID+')'
     48     set @SqlSelectCount = 'count(*) from ( '
     49     set @SqlCounts = 'select distinct '+@ID+' from '+@tblName+')as T'
     50 end
     51 
     52 
     53 if @Sort=0
     54 begin
     55     set @strFSortType=' ASC '
     56     set @strSortType=' DESC '
     57 end
     58 else
     59 begin
     60     set @strFSortType=' DESC '
     61     set @strSortType=' ASC '
     62 end
     63 
     64 if @fldSort IS NOT NULL or @fldSort <>''  
     65 begin
     66     set @FSort=' order by '+ @fldSort +' '+ @strFSortType 
     67     set @DSort=' order by '+ @fldSort +' '+ @strSortType 
     68 end
     69 ELSE
     70 Begin
     71    SET @fldSort=''
     72 END
     73 
     74 
     75 
     76 
     77 --------生成查询语句--------
     78 --此处@strTmp为取得查询结果数量的语句
     79 --print @strCondition
     80 if @strCondition is null or @strCondition=''     --没有设置显示条件
     81 begin   
     82 if @Dist  = 0
     83     begin
     84     set @sqlTmp =  @fldName + ' From ' + @tblName
     85     set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName
     86     set @strID = ' From ' + @tblName
     87     end
     88 else
     89     begin
     90     set @sqlTmp =  @fldName + ' From ' + @tblName
     91     set @strTmp = @SqlSelect+' @Counts='+@SqlSelectCount+@SqlCounts
     92     set @strID = ' From ' + @tblName
     93     end 
     94 end
     95 else
     96 begin
     97 if @Dist =0
     98     begin
     99     set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition
    100     set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition
    101     set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition
    102     end
    103 else
    104    begin
    105     set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition
    106     set @strTmp = @SqlSelect+' @Counts='+@SqlSelectCount+'select distinct '+@ID+' from '+@tblName+' where (1>0) ' + @strCondition+')as T'
    107     set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition
    108    end
    109 end
    110 --print @strTmp
    111 ----取得查询结果总数量-----
    112 exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
    113 declare @tmpCounts int
    114 if @Counts = 0
    115     set @tmpCounts = 1
    116 else
    117     set @tmpCounts = @Counts
    118 
    119     --取得分页总数
    120     set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize
    121 
    122     /**//**当前页大于总页数 取最后一页**/
    123     if @page>@pageCount
    124         set @page=@pageCount
    125 
    126     --/*-----数据分页2分处理-------*/
    127     declare @pageIndex int --总数/页大小
    128     declare @lastcount int --总数%页大小 
    129 
    130     set @pageIndex = @tmpCounts/@pageSize
    131     set @lastcount = @tmpCounts%@pageSize
    132     if @lastcount > 0
    133         set @pageIndex = @pageIndex + 1
    134     else
    135         set @lastcount = @pageSize
    136 
    137     --//***显示分页
    138     if @strCondition is null or @strCondition=''     --没有设置显示条件
    139     begin
    140         --if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理
    141             --begin 
    142                 set @strTmp=  @SqlSelect+' * from ('+@SqlSelect+' '+@fldName+',Row_number() over('+ @FSort+') as IDRank from '+@tblName+')'
    143    +' AS IDWithRowNumber where IDRank>'+CAST(@pageSize*(@page-1) AS Varchar(20)) +' and IDRank<'+CAST(@pageSize*@page+1 AS Varchar(20))
    144             --end
    145         --else
    146         --    begin
    147         --    set @page = @pageIndex-@page+1 --后半部分数据处理
    148         --        if @page <= 1 --最后一页数据显示
    149         --            set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    150         --                +@DSort+') AS TempTB'+@FSort
    151         --        else                
    152         --            set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    153         --                +' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
    154         --                +@DSort+')'
    155         --                +@DSort+') AS TempTB'+@FSort
    156         --    end
    157     end
    158 
    159     else --有查询条件
    160     begin
    161         --if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理
    162         --begin 
    163                 set @strTmp=  @SqlSelect+' * from ('+@SqlSelect+' '+@fldName+',Row_number() over('+ @FSort+') as IDRank from '+@tblName+' Where (1>0) '+@strCondition+')'
    164    +' AS IDWithRowNumber where IDRank>'+CAST(@pageSize*(@page-1) as Varchar(20))+' and IDRank<'+CAST(@pageSize*@page+1 as Varchar(20))                 
    165         --end
    166         --else
    167         --begin 
    168         --    set @page = @pageIndex-@page+1 --后半部分数据处理
    169         --    if @page <= 1 --最后一页数据显示
    170         --            set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    171         --                +' where (1>0) '+ @strCondition +@DSort+') AS TempTB'+@FSort
    172         --    else
    173         --            set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    174         --                +' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
    175         --                +' where (1>0) '+ @strCondition +@DSort+')'
    176         --                + @strCondition +@DSort+') AS TempTB'+@FSort 
    177         --end    
    178     end
    179     --print @strTmp
    180     ------返回查询结果-----
    181 
    182 exec sp_executesql @strTmp
    183 SELECT @pageCount AS PageCount,@Counts AS Counts
    184 --print @strTmp
    185 SET NOCOUNT OFF

     相应的类和方法

        public class PageResultDTO
        {
            public PageResultDTO();
    
            public int Counts { get; set; }
            public int PageCount { get; set; }
            public DataTable Result { get; set; }
        }
    
    
       public PageResultDTO GetPagingData(PageSearchDTO page)
            {
                SqlParameter[] sqlPar = new SqlParameter[]
                {
                    new SqlParameter("@tblName",page.TblName),
                    new SqlParameter("@fldName",page.FieldName),
                    new SqlParameter("@pageSize",page.PageSize),
                    new SqlParameter("@page",page.Page),
                    new SqlParameter("@fldSort",page.FieldSort),
                    new SqlParameter("@Sort",page.Sort),
                    new SqlParameter("@strCondition",page.Condition),
                    new SqlParameter("@ID",page.ID),
                    new SqlParameter("@Dist",page.IsDistint),
                };
                DataSet ds_result = SqlHelper.ExecuteStoreProcedureDataSet(spName.GetPagingData, sqlPar);
                PageResultDTO pageresult = new PageResultDTO();
                if (ds_result != null)
                {
                    pageresult.Result = ds_result.Tables[0];
                    pageresult.PageCount = Convert.ToInt32(ds_result.Tables[1].Rows[0]["PageCount"]);
                    pageresult.Counts = Convert.ToInt32(ds_result.Tables[1].Rows[0]["Counts"]);
                }
    
                return pageresult;
            }
  • 相关阅读:
    【BZOJ2288】生日礼物 [贪心]
    Tinyhttpd阅读笔记
    数据结构-图-经典算法(三)
    数据结构-图-经典算法(二)
    数据结构-图-经典算法(一)
    TCP协议的滑动窗口协议以及流量控制
    2016腾讯实习电话面试总结---2016-03-10
    B树,B+树,B*树
    平衡二叉树(AVL树)
    二叉搜索树(二叉查找树,二叉排序树)
  • 原文地址:https://www.cnblogs.com/Jenny90/p/3578170.html
Copyright © 2011-2022 走看看