ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

sql通用存储过程分页

2022-03-08 19:31:06  阅读:175  来源: 互联网

标签:存储 set 分页 pagesize -- orderbyStr sql nvarchar sqlStr


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:    潇潇与偕
-- Create date: 
-- Description:    分页存储过程
-- =============================================
create PROCEDURE p_Common_DataPager_New
@sqlstr nvarchar(max), --SQL statement 
@currentpage int,    --page #
@pagesize int,      --size of page
@rowcount int output,
@pagecount int output

AS
BEGIN
    set nocount on 
    declare @countSql nvarchar(max)
    declare @dataSql nvarchar(max)
    declare @dbwhitespaceIndex int=0
    declare @orderbyStr nvarchar(max)
    
    
    
    --处理掉多余空格
    set @dbwhitespaceIndex=CHARINDEX('  ',@sqlStr)
    while @dbwhitespaceIndex>0
    begin
     set @sqlStr=REPLACE(@sqlStr,'  ',' ')
     set @dbwhitespaceIndex=CHARINDEX('  ',@sqlStr)
    end

    

    print ('@orderbyStr:'+@orderbyStr)
    --组装无排序字段的查询sql
    if CHARINDEX('ORDER BY',@sqlStr)=0
        begin
            --截取排序字段
            set @orderbyStr=''
            set @dataSql='declare @tempTable table 
                (
                  TemplTableSortId int
                );
                select top '+CONVERT(nvarchar(10),@pagesize)+' dt.* from (
                select ROW_NUMBER() over(order by t.TemplTableSortId) sortid,s.* from ('+@sqlstr+') s
                left join @tempTable t on 0=1) dt
                where dt.sortid> '+convert(nvarchar(10),(@currentpage-1)*@pagesize)
        end
    --组装有排序字段的sql
    else
    begin
         select @orderbyStr= SUBSTRING(@sqlStr,CHARINDEX('ORDER BY',@sqlStr),LEN(@sqlStr))
         set @dataSql='select top '+CONVERT(nvarchar(10),@pagesize)+' dt.* from 
                             ( select ROW_NUMBER() over('+@orderbyStr+') sortid,'+ SUBSTRING(@sqlStr,CHARINDEX('SELECT',@sqlStr)+6,LEN(@sqlStr)-len(@orderbyStr)-6)+') dt where dt.sortid>'+convert(nvarchar(10),(@currentpage-1)*@pagesize)
    end

    --查询总行数
    set @countSql='select @totalcount=count(*)  from ('+ SUBSTRING(@sqlStr,0,LEN(@sqlStr)-len(@orderbyStr))+') t'

    exec sp_executesql @countSql, N'@totalcount int out',@rowcount out

    --计算总页数
    set @pagecount=@rowcount/@pagesize

    if @rowcount%@pagesize>0
    begin
      set @pagecount+=1
    end
    
    exec(@dataSql)
    
    set nocount off 
END
GO

 

标签:存储,set,分页,pagesize,--,orderbyStr,sql,nvarchar,sqlStr
来源: https://www.cnblogs.com/zjbky/p/15982127.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有