zoukankan      html  css  js  c++  java
  • 在数据库里进行分页处理

    最近没事试着写一些简单的存储过程,由于以前很少用到或者很少自己写存储过程。所以历尽各种艰难,让自己也备受打击。

    这是我写的两种排序,一种是使用 not in 

     1 CREATE PROC Self_CommonPage
     2  @pageindex INT ,
     3  @pagesize INT
     4   AS
     5   BEGIN
     6   DECLARE @pagenum INT
     7   DECLARE @countsnum INT
     8   DECLARE @selectnum INT
     9   
    10   SELECT @countsnum= count(keyid) FROM Agent
    11   SET @pagenum=@countsnum/@pagesize
    12   IF(@pageindex<1)  
    13   SET @pageindex=1;
    14   SET @selectnum=1*@pagesize;
    15   
    16   IF(@pageindex>@pagenum)
    17   
    18   SET @pageindex=@pagenum;
    19   SET @selectnum=@pagesize*(@pagenum-1);
    20   IF(1<=@pageindex AND @pageindex<=@pagenum)  
    21   SET @selectnum=@pagesize*(@pagenum-1);
    22   
    23   SELECT TOP(@pagesize) * FROM Agent WHERE KeyId NOT IN (SELECT TOP(@selectnum) keyid FROM Agent)
    24   END
    25   go
    26   
    27   
    NOT IN

    另一种使用的是row_number,

     1 IF object_id('Self_CommonPageByRownumber') IS NOT NULL
     2 DROP PROCEDURE dbo.Self_CommonPageByRownumber
     3 go
     4 CREATE PROC Self_CommonPageByRownumber
     5  @pageindex INT ,
     6  @pagesize INT,
     7  @countsnum INT OUTPUT,
     8  @pagecount int output
     9   AS
    10   set nocount on
    11   BEGIN
    12   DECLARE @pagenum INT
    13   DECLARE @countmiddle INT 
    14   DECLARE @startnum INT
    15   DECLARE @endnum INT
    16   DECLARE @sqlstr VARCHAR(max)
    17   SELECT @countsnum= count(keyid) FROM Agent
    18   SET @countmiddle=@countsnum%@pagesize
    19   SET @pagenum=@countsnum/@pagesize
    20   IF(@countmiddle>0)
    21   BEGIN
    22   SET @pagenum+=1;
    23   END
    24   SET @pagecount=@pagenum
    25   IF(@pageindex<=1) 
    26   BEGIN 
    27   SET @pageindex=1;
    28   SET @startnum=0;
    29   END
    30   IF(@pageindex>@pagenum)
    31   BEGIN
    32   SET @pageindex=@pagenum;
    33   IF(@pageindex*@pagesize>=@countsnum)
    34   SET @startnum=@pagesize*(@pagenum-1);
    35   IF(@pageindex*@pagesize<@countsnum)
    36   SET @startnum=@pagesize*@pagenum
    37   END
    38   IF(1<@pageindex AND @pageindex<=@pagenum)  
    39   SET @startnum=@pagesize*(@pagenum-1)+1; 
    40   SET @endnum=@startnum+@pagesize; 
    41  SET @sqlstr='with pagelist as( SELECT row_number() OVER(ORDER BY CreateDate) as a,* FROM Agent) select * from pagelist WHERE a> '''+convert(nvarchar(128),@startnum)+''' AND a <'''+convert(nvarchar(128),@endnum)+'''';   
    42  
    43  EXEC(@sqlstr)
    44   END
    45 GO
    ROW_NUMBER

    说一下我在写的时候进入的一个误区我在使用row_number的时候最后需要拼sql语句刚开始在行号的比较的时候我是这样写的

    WHERE a> '''+@startnum+''' AND a <'''@endnum+''''

    然后在建立存储过程的时候没有报错,但在执行存储过程的时候开始出错。。我刚开始以为是我的‘号的不对,然后尝试了各种放置位置,到最后我翻了以前数据库里的存储过程,

    才明白自己把这里当成了像VS一样的string字符串的拼接,但是@参数是一个int类型,两种不同的类型是拼不到一块的(不包括可以隐式转换的类型)。后来使用了convert()方法

    将参数转化为varchar格式再拼接进去就好了。

    还有一点就是row_number与rank 的不同,两个虽然都可以用在排序里,但是row_number 只仅仅是一行行数据的排列,不涉及相同排序的依据,每一行数据返回不同的bigint

    值。而rank却是相同的排序依据回返回相同的bigint值。详情请参阅http://bear-study-hard.cnblogs.com/archive/2006/02/09/327723.html

  • 相关阅读:
    .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
    使用Visual Studio Code开发.NET Core看这篇就够了
    ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
    asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程
    【半译】扩展shutdown超时设置以保证IHostedService正常关闭
    从零搭建分布式文件系统MinIO比FastDFS要更合适
    用asp.net core结合fastdfs打造分布式文件存储系统
    在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度
    Nuget多项目批量打包上传服务器的简明教程
    一个新实验:使用gRPC-Web从浏览器调用.NET gRPC服务
  • 原文地址:https://www.cnblogs.com/qzzy/p/3757505.html
Copyright © 2011-2022 走看看