分页存储过程(转)

分页存储过程(转)

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python读取图像数据的一些方法[通俗易懂]

    python读取图像数据的一些方法[通俗易懂]工作和学习中设计一个神经网络中经常需要设计一个数据载入器。首先第一件事我们要根据我们的任务要求确定一个数据提供的方法。如我们是一个分类任务,我们就需要读取数据和数据本身对应的标签。12除了分类任务之外当然还有一些图像到图像的任务,如…

    2025年10月30日
    3
  • dump 分析工具_一键全扒网站工具

    dump 分析工具_一键全扒网站工具ProcDumpProcDump是一个命令行实用程序,其主要目的是监视应用程序的CPU峰值,并在峰值期间生成崩溃转储,管理员或开发人员可以使用它来确定峰值的原因。ProcDump还包括挂起窗口监视(使用与Windows和任务管理器使用的窗口挂起相同的定义)、未处理的异常监视,并且可以根据系统性能计数器的值生成转储。它还可以作为一个通用的进程转储实用程序,您可以将其嵌入到其他脚本中。官网DebugDiag调试诊断工具(DebugDiag)旨在帮助解决任何用户模式进程中的挂起、性能缓慢、内存泄漏

    2022年10月2日
    3
  • 卡巴斯基中国官方技术论坛即将开放[通俗易懂]

    卡巴斯基中国官方技术论坛即将开放[通俗易懂]卡巴斯基筹备已久的官方技术论坛近期将上线,将给众多卡巴斯基粉丝和技术爱好者提供一个沟通交流的平台。早前,卡巴斯基顺应本地化服务策略,开通400技术支持热线。在艾瑞最新的一份报告中,国内安全软件市场三强的排名改头换面,卡巴斯基…

    2022年8月20日
    14
  • Excel VBA编程

    Excel VBA编程文章目录如何创建VBAVBA语法规则声明变量给变量赋值让变量存储的数据参与运算关于声明变量的其他知识变量的作用域特殊的变量——数组声明多维数组声明动态数组其他创建数组的方法数组函数利用UBound求数组的最大索引号利用LBound函数求最小索引号求多维数组的最大和最小索引号用join函数将一维数组合并成字符串将数组内容写入工作表中数组的存取特殊数据的专用容器——常量对象,集合及对象的属性和方法VB…

    2022年4月28日
    82
  • Wireshark抓包详解[通俗易懂]

    Wireshark抓包详解[通俗易懂]简述wireshark是非常流行的网络封包分析工具,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。使用wireshark的人必须了解网络协议,否则就看不懂wireshark了。为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。 wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshar

    2025年9月25日
    7
  • Pytest(1)安装与入门「建议收藏」

    Pytest(1)安装与入门「建议收藏」pytest介绍pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它

    2022年7月31日
    7

发表回复

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

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