分页存储过程(转)

分页存储过程(转)

CREATE PROC
 sp_PageView
@tbname     sysname,               要分页显示的表名



@FieldKey   nvarchar(1000),      用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段


@PageCurrent int=1,               要显示的页码


@PageSize   int=10,                每页的大小(记录数)


@FieldShow nvarchar(1000)=,      以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段


@FieldOrder nvarchar(1000)=,      以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC


                                          用于指定排序顺序
@Where    nvarchar(1000)=,     查询条件



@PageCount int OUTPUT             总页数


AS


SET NOCOUNT ON


检查对象是否有效


IF OBJECT_ID(@tbnameIS NULL


BEGIN

    

RAISERROR(N对象”%s”不存在,1,16,@tbname
)
    
RETURN



END


IF OBJECTPROPERTY(OBJECT_ID(@tbname),NIsTable)=0

    

AND OBJECTPROPERTY(OBJECT_ID(@tbname),NIsView)=0

    

AND OBJECTPROPERTY(OBJECT_ID(@tbname),NIsTableFunction)=0


BEGIN

    

RAISERROR(N“%s”不是表、视图或者表值函数,1,16,@tbname
)
    
RETURN



END


分页字段检查


IF ISNULL(@FieldKey,N)=


BEGIN

    

RAISERROR(N分页处理需要主键(或者惟一键),1,16
)
    
RETURN



END


其他参数检查及规范


IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1


IF ISNULL(@PageSize,0)<1 SET @PageSize=10


IF ISNULL(@FieldShow,N)=N SET @FieldShow=N*


IF ISNULL(@FieldOrder,N)=N

    

SET @FieldOrder=N


ELSE

    

SET @FieldOrder=NORDER BY +LTRIM(@FieldOrder
)
IF ISNULL(@Where,N)=N


    

SET @Where=N


ELSE

    

SET @Where=NWHERE (+@Where+N)


如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)


IF @PageCount IS NULL


BEGIN

    

DECLARE @sql nvarchar(4000
)
    
SET @sql=NSELECT @PageCount=COUNT(*)


        

+N FROM +@tbname

        

+N +@Where

    

EXEC sp_executesql @sql,N@PageCount int OUTPUT,@PageCount
 OUTPUT
    
SET @PageCount=(@PageCount+@PageSize1)/@PageSize



END


计算分页显示的TOPN值


DECLARE @TopN varchar(20),@TopN1 varchar(20
)
SELECT @TopN=@PageSize

,
    
@TopN1=(@PageCurrent1)*@PageSize


第一页直接显示


IF @PageCurrent=1

    

EXEC(NSELECT TOP +@TopN

        

+N +@FieldShow

        

+N FROM +@tbname

        

+N +@Where

        

+N +@FieldOrder
)
ELSE



BEGIN

    

处理别名


    IF @FieldShow=N*

        

SET @FieldShow=Na.*

    
生成主键(惟一键)处理条件


    DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000
),
        
@s nvarchar(1000),@Field

 sysname
    
SELECT @Where1=N,@Where2=N,@s=@FieldKey


    

WHILE CHARINDEX(N,,@s)>0

        

SELECT @Field=LEFT(@s,CHARINDEX(N,,@s)1
),
            
@s=STUFF(@s,1,CHARINDEX(N,,@s),N

),
            
@Where1=@Where1+N AND a.+@Field+N=b.+@Field

,
            
@Where2=@Where2+N AND b.+@Field+N IS NULL

,
            
@Where=REPLACE(@Where,@Field,Na.+@Field

),
            
@FieldOrder=REPLACE(@FieldOrder,@Field,Na.+@Field

),
            
@FieldShow=REPLACE(@FieldShow,@Field,Na.+@Field

)
    
SELECT @Where=REPLACE(@Where,@s,Na.+@s

),
        
@FieldOrder=REPLACE(@FieldOrder,@s,Na.+@s

),
        
@FieldShow=REPLACE(@FieldShow,@s,Na.+@s

),
        
@Where1=STUFF(@Where1+N AND a.+@s+N=b.+@s,1,5,N

),    
        
@Where2=CASE


            

WHEN @Where= THEN NWHERE (

            

ELSE @Where+N AND (

            

END+Nb.+@s+N IS NULL+@Where2+N)

    
执行查询


    EXEC(NSELECT TOP +@TopN

        

+N +@FieldShow

        

+N FROM +@tbname

        

+N a LEFT JOIN(SELECT TOP +@TopN1

        

+N +@FieldKey

        

+N FROM +@tbname

        

+N a +@Where

        

+N +@FieldOrder

        

+N)b ON +@Where1

        

+N +@Where2

        

+N +@FieldOrder
)
END


转载于:https://www.cnblogs.com/3_mu/archive/2010/06/27/1766131.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110758.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月6日 下午6:00
下一篇 2021年8月6日 下午7:00


相关推荐

  • TOTP动态密钥生成器Linux/C/C++实现

    TOTP动态密钥生成器Linux/C/C++实现TOTP 动态密钥生成器 Linux C C TOTP h ifndef TOTP H define TOTP H include iostream include sstream include string include vector include ctime include iomanip include algorithm definePUBLIC K algorithm iomanip ctime vector string sstream iostream

    2026年3月16日
    2
  • Java多线程超详解

    Java多线程超详解引言随着计算机的配置越来越高,我们需要将进程进一步优化,细分为线程,充分提高图形化界面的多线程的开发。这就要求对线程的掌握很彻底。那么话不多说,今天本帅将记录自己线程的学习。线程的相关API//获取当前线程的名字Thread.currentThread().getName()1.start():1.启动当前线程2.调用线程中的run方法2.run():通常需要重写Thread类中的此…

    2022年6月6日
    35
  • springboot启动时是如何加载配置文件application.yml文件

    springboot启动时是如何加载配置文件application.yml文件今天启动springboot时,明明在resources目录下面配置了application.yml的文件,但是却读不出来,无奈看了下源码,总结一下springboot查找配置文件路径的过程,能力有限,欢迎各位大牛指导!!!spring加载配置文件是通过listener监视器实现的,在springboot启动时:在容器启动完成后会广播一个SpringApplicationEvent事件,而Spri…

    2025年9月26日
    7
  • python3反爬虫原理与绕过实战 网盘_Python 3反爬虫原理与绕过实战「建议收藏」

    第1章 开发环境配置11.1 操作系统的选择11.1.1 Ubuntu简介11.1.2 VirtualBox的安装21.1.3 安装Ubuntu31.1.4 全屏设置81.1.5 Python设置91.2 练习平台Steamboat101.2.1 安装Docker111.2.2 安装Steamboat121.2.3 Steamboat使用说明141.3 第三…

    2022年4月8日
    234
  • 10. 通用避坑要点与效率提升技巧

    10. 通用避坑要点与效率提升技巧

    2026年3月16日
    1
  • live2d模型_判别模型

    live2d模型_判别模型★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:MindDraft➤博主域名:https://www.zengqiang.org➤GitHub地址:ht

    2022年8月3日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号