分页存储过程(转)

分页存储过程(转)

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • fcntl 函数「建议收藏」

    fcntl 函数「建议收藏」fcntl函数浅解Linux系统中使用man查看fcntl函数的原型为fcntl(intfd,intcmd,……/arg/);自己在使用时用到了fcntl(intfd,intcmd,longarg);F_SETFL:设置文件状态标志。将文件的状态标志设置为第三个参数arg的值(取整数值),其中O_RDONLY,O_WRONLY,O_RDWR,O_CREAT

    2022年10月26日
  • leetcode516_leetcode46

    leetcode516_leetcode46Givenacollectionofnumbers,returnallpossiblepermutations.Forexample,[1,2,3] havethefollowingpermutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2],and [3,2,1].思路:递归咯c

  • datadrip 激活码(JetBrains全家桶)

    (datadrip 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 电平转换实现简述_为什么要进行电平转换

    电平转换实现简述_为什么要进行电平转换电平转换实现简述1.前言2.BJT和mos实现3.二极管实现4.电阻实现1.前言在设计电路时,很多情况下会出现电平不匹配的情况,最常用的方式就是增加电平转换芯片。那自然就会想到其实现思想源自于哪?如果用分离器件搭,如何能实现?下图是SN74ALVC164245的逻辑框图,包含与门和反相器,与门主要实现使能和方向控制,反向器用来实现信号传输。2.BJT和mos实现以NPN的BJT和NMOS为例来说,集电极输出和漏极输出是最简单的反相器。只不过由于BJT和MOS本身的特性,BJT只能单向传输

  • mt4多账户_sem怎么搭建账户

    mt4多账户_sem怎么搭建账户PAM/man系统通常适用于基金/外汇领域。技术部署于manage后台、MT4/MT5白标、主标皆可适用。PAMMM系统以跟单社区的模式,设置好主账号,类似于followme、信号源会发出一定的信号,跟随者按照指定的逻辑程序,占有比例去实时跟进,并且得到一个结果。PAM系统可以有IB形式、比例分层、返佣计算等一个综合后台。…

  • elasticSearch字段类型大全

    elasticSearch字段类型大全ES字段类型核心数据类型String类型:text、keyworknumber类型:long,integer,short,byte,double,float,half_float,scaled_floatdate类型:dateboolean类型:booleanbinary类型:binaryrange类型:integer_range,float_range,long_range,double_range,date_range复杂数据类型对象数据类型:object用

发表回复

您的电子邮箱地址不会被公开。

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