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

      1 -----------------------------------------------------------------------------------------------------
      2 --TOP n 实现的通用分页存储过程
      3 CREATE PROC sp_PageView(
      4     @tbname sysname,                 --要分页显示的表名
      5     @FieldKey NVARCHAR(1000),        --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
      6     @PageCurrent INT=1,              --要显示的页码
      7     @PageSize INT=10,                --每页的大小(记录数)
      8     @FieldShow NVARCHAR(1000)='',    --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
      9     @FieldOrder NVARCHAR(1000)='',   --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC 用于指定排序顺序
     10     @Where nvarchar(1000)='',        --查询条件
     11     @PageCount INT OUTPUT            --总页数
     12 )
     13 AS
     14 SET NOCOUNT ON
     15 --检查对象是否有效
     16 
     17 IF OBJECT_ID(@tbname) IS NULL
     18 BEGIN
     19     RAISERROR(N'对象"%s"不存在', 1, 16, @tbname)
     20     RETURN
     21 END
     22 
     23 
     24 IF OBJECTPROPERTY(OBJECT_ID(@tbname), N'IsTable') = 0
     25     AND OBJECTPROPERTY(OBJECT_ID(@tbname), N'IsView') = 0
     26     AND OBJECTPROPERTY(OBJECT_ID(@tbname), N'IsTableFunction') = 0
     27 BEGIN
     28     RAISERROR(N'"%s"不是表、视图或者表值函数', 1, 16, @tbname)
     29     RETURN
     30 END
     31 
     32 --分页字段检查
     33 IF ISNULL(@FieldKey, N'')=''
     34 BEGIN
     35     RAISERROR(N'分页处理需要主键(或者惟一键)', 1, 16)
     36     RETURN
     37 END
     38 
     39 --其他参数检查及规范
     40 IF ISNULL(@PageCurrent, 0) < 1 
     41     SET @PageCurrent = 1
     42 
     43 IF ISNULL(@PageSize,0) < 1 
     44     SET @PageSize = 10
     45 
     46 IF ISNULL(@FieldShow, N'') = N'' 
     47     SET @FieldShow = N'*'
     48 
     49 IF ISNULL(@FieldOrder, N'') = N''
     50     SET @FieldOrder = N''
     51 ELSE
     52     SET @FieldOrder = N'ORDER BY ' + LTRIM(@FieldOrder)
     53     
     54 IF ISNULL(@Where, N'') = N''
     55     SET @Where = N''
     56 ELSE
     57     SET @Where = N'WHERE ('+@Where+N')'
     58 
     59 
     60 
     61 --如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,
     62 --以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
     63 IF @PageCount IS NULL
     64 BEGIN
     65     DECLARE @sql NVARCHAR(4000)
     66     SET @sql=N'SELECT @PageCount=COUNT(*)'
     67         + N' FROM ' + @tbname
     68         + N' ' + @Where
     69     EXEC sp_executesql @sql, N'@PageCount int OUTPUT', @PageCount OUTPUT
     70     SET @PageCount = (@PageCount + @PageSize-1) / @PageSize
     71 END
     72 
     73 --计算分页显示的TOPN值
     74 DECLARE @TopN VARCHAR(20), @TopN1 VARCHAR(20)
     75 SELECT @TopN = @PageSize,
     76        @TopN1 = (@PageCurrent-1) * @PageSize
     77 
     78 --第一页直接显示
     79 IF @PageCurrent = 1
     80 EXEC(N'SELECT TOP ' + @TopN
     81              + N' ' + @FieldShow
     82          +N' FROM ' + @tbname
     83              + N' ' + @Where
     84              + N' ' + @FieldOrder)
     85 ELSE
     86 BEGIN
     87     --处理别名
     88     IF @FieldShow = N'*'
     89         SET @FieldShow = N'a.*'
     90 
     91     --生成主键(惟一键)处理条件
     92     DECLARE @Where1 nvarchar(4000),
     93             @Where2 nvarchar(4000),
     94                  @s nvarchar(1000),
     95              @Field sysname
     96     
     97     SELECT @Where1=N'', @Where2=N'', @s=@FieldKey
     98     WHILE CHARINDEX(N',',@s) > 0
     99         
    100     SELECT @Field = LEFT(@s, CHARINDEX(N',',@s)-1),
    101                @s = STUFF(@s, 1, CHARINDEX(N',',@s), N''),
    102           @Where1 = @Where1 + N' AND a.' + @Field + N'=b.' + @Field,
    103           @Where2 = @Where2 + N' AND b.' + @Field + N' IS NULL',
    104            @Where = REPLACE(@Where, @Field, N'a.' + @Field),
    105       @FieldOrder = REPLACE(@FieldOrder, @Field, N'a.' + @Field),
    106        @FieldShow = REPLACE(@FieldShow, @Field, N'a.' + @Field)
    107     
    108     
    109     SELECT @Where = REPLACE(@Where, @s, N'a.' + @s),
    110       @FieldOrder = REPLACE(@FieldOrder, @s, N'a.' + @s),
    111        @FieldShow = REPLACE(@FieldShow, @s, N'a.' + @s),
    112           @Where1 = STUFF(@Where1 + N' AND a.' + @s + N'=b.' + @s, 1, 5, N''),    
    113           @Where2 = CASE
    114     WHEN @Where = '' THEN N'WHERE (' ELSE @Where + N' AND (' END + N'b.' + @s + N' IS NULL' + @Where2 + N')'
    115 
    116     
    117     
    118     --执行查询
    119 EXEC(N'SELECT TOP ' + @TopN
    120              + N' ' + @FieldShow
    121         + N' FROM ' + @tbname
    122         + N' a LEFT JOIN(SELECT TOP ' + @TopN1
    123              + N' ' + @FieldKey
    124         + N' FROM ' + @tbname
    125            + N' a ' + @Where
    126              + N' ' + @FieldOrder
    127         + N')b ON ' + @Where1
    128              + N' ' + @Where2
    129              + N' ' + @FieldOrder)
    130 END

    另,一个查询的思路

    1   m:代表总记录数(m>02   n:代表每页显示N条记录(n>03   page:代表当前页(page从0开始)
    4   求总页数:(m%n)==0?(m/n):(m/n+1);
    5 
    6   select top n * from 表名 where id not in(select top (n*page) id from 表名 order by 排序) order by 排序
  • 相关阅读:
    理解serverless无服务
    书单
    服务框架
    消息队列
    幂等设计
    MyBatis 3判断不为null
    Spring实现封装自定义注解@Trimmed清除字符串前后的空格
    Spring关于使用注解@Configuration去配置FormattingConversionServiceFactoryBean来实现自定义格式字符串处理无效的问题(未找到是什么原因造成的)
    Eclipse错误出现:Unable to install breakpoint in... (未能解决)
    Spring Boot中application.yml与bootstrap.yml的区别(转)
  • 原文地址:https://www.cnblogs.com/Johnfx-home/p/7124993.html
Copyright © 2011-2022 走看看