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

           看了很多的分页存储过程,感觉用起来还是没有自己亲自写的用起来感觉亲切,虽然写的比较烂,但是对这个方面的提高还是只有靠自己亲自动手才知道其中的微妙之处.
          存储过程代码如下所示:

    存储过程
     1 CREATE PROCEDURE     [dbo].[TopPageList]  
     2     @strTable       varchar(200),   --表名 ("@strTable""myUser");
     3     @strColumn      varchar(50),    --按该列来进行分页 ("@strColumn""UserId");  
     4     @strOrderColumn  varchar(50),    --排序字段order by XXX desc
     5     @intOrder     int,--排序的顺序 0 升序 1降序
     6     @strColumnlist  varchar(150)  , --要查询出的字段列表,*表示全部字段  cmd.Parameters.Add("@strColumnlist""*");   
     7     @strWhere       varchar(800)='',  --查询条件 cmd.Parameters.Add("@strWhere"""); 
     8     @intPageSize    int,           --每页记录数  cmd.Parameters.Add("@intPageSize"15);
     9     @intPageNum     int,           --指定页  cmd.Parameters.Add("@intPageNum"5);
    10   --  @intPageCount   int   OUTPUT  , --总页数  SqlParameter paramPageCount = cmd.Parameters.Add("@intPageCount", SqlDbType.Int);
    11    -- paramPageCount.Direction = ParameterDirection.Output; 
    12     @itemCount      int   OUTPUT  
    13 --   @doCount bit = 0-- 返回, 非值则返回记录总数
    14   AS 
    15 --设置相应的空格
    16  
    17 --设置DESC ASC
    18   if @intOrder=0  --0升序
    19      set @strOrderColumn=' order by '+@strOrderColumn
    20   else            --降序
    21      set @strOrderColumn=' order by '+@strOrderColumn +' desc '
    22  
    23   DECLARE   @sql    nvarchar(2000--用于构造SQL语句
    24   DECLARE   @where1 varchar(800)   --构造条件语句
    25   DECLARE   @where2 varchar(800)   --构造条件语句
    26   IF   @strWhere   is   null   or   rtrim(@strWhere)=''   
    27   -- 为了避免SQL关键字与字段、表名等连在一起,首先为传入的变量添加空格
    28   BEGIN  --没有查询条件  
    29       SET   @where1=' WHERE '   
    30       SET   @where2=' '   
    31   END   
    32   ELSE   
    33   BEGIN  --有查询条件  
    34       SET   @where1=' WHERE  ('+@strWhere+')  AND  ' 
    35       SET   @where2=' WHERE  ('+@strWhere+')  '   
    36   END 
    37   ------构造SQL语句,计算总页数。计算公式为总页数= Ceiling ( 记录个数/ 页大小)
    38    --计算总项数
    39   SET   @sql='SELECT   @itemCount=COUNT('+@strColumn+')  from   '+@strTable +@where2  
    40 print(@sql)
    41   EXEC sp_executesql  @sql,N'@itemCount  int   OUTPUT',@itemCount   OUTPUT 
    42    --   1:直接计算    2:自己写个分页控件里面设置一下也可以~
    43  -- set @intPageCount  =floor(cast(@itemCount as float)/@intPageSize)
    44   --   if @intPageCount <cast(@itemCount as float)/@intPageSize
    45   --   set @intPageCount =@intPageCount +1
    46 --  
    47  
    48    
    49   --执行SQL语句,计算总页数,并将其放入@intPageCount变量中
    50   
    51   --将总页数放到查询返回记录集的第一个字段前,此语句可省略
    52   SET  @strColumnlist=' '+ Cast(@itemCount as varchar(30)) + ' as itemCount,' +' '+ @strColumnlist   
    53  --+ Cast(@intPageCount as varchar(30)) + ' as PageCount,' 
    54   SET @sql='SELECT TOP '+ CAST(@intPageSize   AS   varchar)  +  @strColumnlist +   
    55                 ' FROM ' + @strTable + @where1 + '  '+
    56                 @strColumn + ' not in  '+   
    57                 '  (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1)  AS  varchar) + ' ' + 
    58                 @strColumn + ' FROM '+ @strTable+@where2+@strOrderColumn+')  ' + @strOrderColumn  
    59   print(@sql)
    60  
    61 --ELSE 
    62 --     begin   --构造降序的SQL ---针对2个表的时候会出现聚合函数的异常--适合单个表格的数据库分页操作
    63  --     SET @sql='SELECT TOP '+ CAST(@intPageSize   AS   varchar)  +  @strColumnlist +   
    64  --               ' FROM ' + @strTable + @where1 + '  '+
    65   --              @strColumn + '<(SELECT MIN('+@strColumn+')  '+   
    66   --              ' FROM (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1)  AS  varchar) + ' ' + 
    67  --              @strColumn + ' FROM '+ @strTable+@where2+@strOrderColumn+')  as tblTmp)' + @strOrderColumn  
    68   --    print(@sql)
    69  --     end  
    70   IF   @intPageNum=1--第一页  
    71       SET   @sql='SELECT   TOP   '+CAST(@intPageSize   AS   varchar) + @strColumnlist + ' FROM '+@strTable+   
    72                  @where2+@strOrderColumn 
    73   --END   
    74 --PRINT   @sql   
    75 print(@sql)
    76 exec(@sql)
    77 

           相应的操作代码如下所示:

    C#操作代码
     1 public static void BindingContent(string strTable, string strColumn, string strOrderColumn, int intOrder, string strColumnlist, string strWhere, IChangePageStored changePage)
     2         {
     3            
     4             SqlParameter[] paras=new SqlParameter[9];
     5             paras[0= new SqlParameter("@strTable" ,SqlDbType.VarChar);
     6             paras[0].Value = strTable;
     7             paras[1= new SqlParameter("@strColumn", SqlDbType.VarChar);
     8             paras[1].Value = strColumn;
     9             paras[2= new SqlParameter("@strOrderColumn", SqlDbType.VarChar);
    10             paras[2].Value = strOrderColumn;
    11             paras[3= new SqlParameter("@strColumnlist", SqlDbType.VarChar);
    12             paras[3].Value = strColumnlist;
    13             paras[4= new SqlParameter("@intOrder", SqlDbType.Int);
    14             paras[4].Value = intOrder;
    15             paras[5= new SqlParameter("@strWhere", SqlDbType.VarChar);
    16             paras[5].Value = strWhere;
    17             paras[6= new SqlParameter("@intPageSize", SqlDbType.Int);
    18             paras[6].Value = changePage.PageSize;
    19             paras[7= new SqlParameter("@intPageNum", SqlDbType.Int);
    20             paras[7].Value = changePage.CurrentPage  ;
    21          //   paras[8] = new SqlParameter("@intPageCount", SqlDbType.Int);
    22          //   paras[8].Direction = ParameterDirection.Output;
    23             paras[8= new SqlParameter("@itemCount", SqlDbType.Int);
    24             paras[8].Direction = ParameterDirection.Output;
    25             DataSet ds = DBTool.ExecuteDataset(CommandType.StoredProcedure, "TopPageList", paras);
    26              
    27           /*  @intPageCount   int   OUTPUT  , --总页数  SqlParameter paramPageCount = cmd.Parameters.Add("@intPageCount", SqlDbType.Int);
    28    -- paramPageCount.Direction = ParameterDirection.Output; 
    29     
    30                 @strTable = N'zhq_in_content c  INNER JOIN zhp_in_columns  m ON c.columns_id=m.columns_id',
    31   @strColumn = N'c.content_id',
    32   @strOrderColumn = N'c.createdate',
    33   @intOrder = 1,
    34   @strColumnlist = N'*',
    35   @strWhere = N'c.status=0 AND c.del=0',
    36   @intPageSize = 20,
    37   @intPageNum =100,*/
    38             changePage.DataSource = ds.Tables[0].DefaultView;// 设置分页控件的数据
    39             if (ds != null && ds.Tables[0].Rows.Count > 0)
    40             {
    41                 changePage.RecordCount = int.Parse(ds.Tables[0].Rows[0]["itemCount"].ToString());
    42                // changePage.PageCount = int.Parse(ds.Tables[0].Rows[0]["PageCount"].ToString());
    43             }
    44             if (changePage.DataUI.GetType().BaseType.Name == "BaseDataList")
    45             {
    46                 changePage.DataUI.DataSource = changePage.DataSource;//设置数据源控件的数据
    47                 changePage.DataUI.DataBind();
    48                
    49             }
    50 
    51         }      
    52 
  • 相关阅读:
    激活win10系统的方法(亲测)
    java使用jxl,自动导出数据excle,quartz自动发送邮件
    java对接网银支付案例
    将数字转换成Excel表头格式的字母序号
    mysql date_add日期函数的使用
    itext A4纸张横向创建PDF
    Spring 定时器 定时访问数据库并发送邮件
    mvc路由报错
    eval()和$.parseJSON()注意事项
    跨域学习笔记
  • 原文地址:https://www.cnblogs.com/jasenkin/p/1626840.html
Copyright © 2011-2022 走看看