分页存储过程(转)

分页存储过程(转)

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


相关推荐

  • [转][darkbaby]任天堂传——失落的泰坦王朝(下)[通俗易懂]

    [转][darkbaby]任天堂传——失落的泰坦王朝(下)[通俗易懂]即使是日本业界人士也对1999年发生的“口袋妖怪所有权风波”知之甚少,实际上这个事件的结局足以改变游戏产业未来数十年的势力图,山内溥凭借着个人的睿智让任天堂再次渡过了命运的暗礁,而另一颗曾经炙手可热的璀璨明星却从此销声匿迹……   株式会社POKEMON(简称TPC)成立于1998年4月,由任天堂、Creatures、GAMEFREAK三社共同出资组建,该社成立的目的主要是对全球范围的口…

    2022年7月27日
    21
  • 彻底弄清 anchorPoint 和 position「建议收藏」

    彻底弄清 anchorPoint 和 position「建议收藏」最近在研读《iOSCoreAnimationAdvancedTechniques》这一本书,想系统地学习下关于CALayer、Transition、以及动画等知识点。大家可以在gitbook上面找到该书的翻译版本。传送门在读到图层几何学这一章的时候,了解到了两个概念:anchorPoint和position。之前一直把position当成是矩形的中心点,如同UIView的center属性(事实上,在不改变anchorPoint的前提下,它确实是图层的中心点),但..

    2022年10月8日
    3
  • java mediatype utf-8_Java MediaType.APPLICATION_JSON_UTF8屬性代碼示例

    java mediatype utf-8_Java MediaType.APPLICATION_JSON_UTF8屬性代碼示例/***Searches{@linkorg.springframework.web.bind.annotation.RequestMappingRequestMapping}*annotationonthegivenmethodargumentandextracts*IfRequestMappingannotationisnotfound,NoRequestM…

    2022年5月12日
    35
  • Python中if __name__ == ‘__main__‘:的作用和原理

    Python中if __name__ == ‘__main__‘:的作用和原理if__name__==’__main__’:的作用一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if__name__==’main’:的作用就是控制这两种情况执行代码的过程,在if__name__==’main’:下的代码只有在第一种情况下(即文件作为脚本直接执行)才会…

    2022年6月1日
    36
  • MySQL 实现行转列SQL

    MySQL 实现行转列SQL概述好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下。问题链接:关于Mysql的分级输出问题情景简介学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列。数据表里面数据如下图,使用姓名+课程作为联合主键(有些需求可能不需要联合主键)。本文以MySQL为基础,其他数据库会有些许语法不同。数据库表数据:处理后的结果(行转列):方法一:这里可以使用Max,也可…

    2022年6月10日
    37
  • activiti7入门_react demo

    activiti7入门_react demo项目框架描述项目基于springboot2.1.1<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.1.RELE…

    2022年8月30日
    5

发表回复

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

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