热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

118.TOPN实现通用分页存储过程

CREATEPROCsp_PageViewtbnamesysname,--要分页显示的表名FieldKeynvarchar(1000),--用于定位记录的主键(惟一键)字段

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(@tbname) IS NULL
BEGINRAISERROR(N'对象"%s"不存在',1,16,@tbname)RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGINRAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)RETURN
END--分页字段检查
IF ISNULL(@FieldKey,N'')=''
BEGINRAISERROR(N'分页处理需要主键(或者惟一键)',1,16)RETURN
END--其他参数检查及规范
IF ISNULL(&#64;PageCurrent,0)<1 SET &#64;PageCurrent&#61;1
IF ISNULL(&#64;PageSize,0)<1 SET &#64;PageSize&#61;10
IF ISNULL(&#64;FieldShow,N&#39;&#39;)&#61;N&#39;&#39; SET &#64;FieldShow&#61;N&#39;*&#39;
IF ISNULL(&#64;FieldOrder,N&#39;&#39;)&#61;N&#39;&#39;SET &#64;FieldOrder&#61;N&#39;&#39;
ELSESET &#64;FieldOrder&#61;N&#39;ORDER BY &#39;&#43;LTRIM(&#64;FieldOrder)
IF ISNULL(&#64;Where,N&#39;&#39;)&#61;N&#39;&#39;SET &#64;Where&#61;N&#39;&#39;
ELSESET &#64;Where&#61;N&#39;WHERE (&#39;&#43;&#64;Where&#43;N&#39;)&#39;--如果&#64;PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给&#64;PageCount赋值)
IF &#64;PageCount IS NULL
BEGINDECLARE &#64;sql nvarchar(4000)SET &#64;sql&#61;N&#39;SELECT &#64;PageCount&#61;COUNT(*)&#39;&#43;N&#39; FROM &#39;&#43;&#64;tbname&#43;N&#39; &#39;&#43;&#64;WhereEXEC sp_executesql &#64;sql,N&#39;&#64;PageCount int OUTPUT&#39;,&#64;PageCount OUTPUTSET &#64;PageCount&#61;(&#64;PageCount&#43;&#64;PageSize-1)/&#64;PageSize
END--计算分页显示的TOPN值
DECLARE &#64;TopN varchar(20),&#64;TopN1 varchar(20)
SELECT &#64;TopN&#61;&#64;PageSize,&#64;TopN1&#61;(&#64;PageCurrent-1)*&#64;PageSize--第一页直接显示
IF &#64;PageCurrent&#61;1EXEC(N&#39;SELECT TOP &#39;&#43;&#64;TopN&#43;N&#39; &#39;&#43;&#64;FieldShow&#43;N&#39; FROM &#39;&#43;&#64;tbname&#43;N&#39; &#39;&#43;&#64;Where&#43;N&#39; &#39;&#43;&#64;FieldOrder)
ELSE
BEGIN--处理别名IF &#64;FieldShow&#61;N&#39;*&#39;SET &#64;FieldShow&#61;N&#39;a.*&#39;--生成主键(惟一键)处理条件DECLARE &#64;Where1 nvarchar(4000),&#64;Where2 nvarchar(4000),&#64;s nvarchar(1000),&#64;Field sysnameSELECT &#64;Where1&#61;N&#39;&#39;,&#64;Where2&#61;N&#39;&#39;,&#64;s&#61;&#64;FieldKeyWHILE CHARINDEX(N&#39;,&#39;,&#64;s)>0SELECT &#64;Field&#61;LEFT(&#64;s,CHARINDEX(N&#39;,&#39;,&#64;s)-1),&#64;s&#61;STUFF(&#64;s,1,CHARINDEX(N&#39;,&#39;,&#64;s),N&#39;&#39;),&#64;Where1&#61;&#64;Where1&#43;N&#39; AND a.&#39;&#43;&#64;Field&#43;N&#39;&#61;b.&#39;&#43;&#64;Field,&#64;Where2&#61;&#64;Where2&#43;N&#39; AND b.&#39;&#43;&#64;Field&#43;N&#39; IS NULL&#39;,&#64;Where&#61;REPLACE(&#64;Where,&#64;Field,N&#39;a.&#39;&#43;&#64;Field),&#64;FieldOrder&#61;REPLACE(&#64;FieldOrder,&#64;Field,N&#39;a.&#39;&#43;&#64;Field),&#64;FieldShow&#61;REPLACE(&#64;FieldShow,&#64;Field,N&#39;a.&#39;&#43;&#64;Field)SELECT &#64;Where&#61;REPLACE(&#64;Where,&#64;s,N&#39;a.&#39;&#43;&#64;s),&#64;FieldOrder&#61;REPLACE(&#64;FieldOrder,&#64;s,N&#39;a.&#39;&#43;&#64;s),&#64;FieldShow&#61;REPLACE(&#64;FieldShow,&#64;s,N&#39;a.&#39;&#43;&#64;s),&#64;Where1&#61;STUFF(&#64;Where1&#43;N&#39; AND a.&#39;&#43;&#64;s&#43;N&#39;&#61;b.&#39;&#43;&#64;s,1,5,N&#39;&#39;), &#64;Where2&#61;CASEWHEN &#64;Where&#61;&#39;&#39; THEN N&#39;WHERE (&#39;ELSE &#64;Where&#43;N&#39; AND (&#39;END&#43;N&#39;b.&#39;&#43;&#64;s&#43;N&#39; IS NULL&#39;&#43;&#64;Where2&#43;N&#39;)&#39;--执行查询EXEC(N&#39;SELECT TOP &#39;&#43;&#64;TopN&#43;N&#39; &#39;&#43;&#64;FieldShow&#43;N&#39; FROM &#39;&#43;&#64;tbname&#43;N&#39; a LEFT JOIN(SELECT TOP &#39;&#43;&#64;TopN1&#43;N&#39; &#39;&#43;&#64;FieldKey&#43;N&#39; FROM &#39;&#43;&#64;tbname&#43;N&#39; a &#39;&#43;&#64;Where&#43;N&#39; &#39;&#43;&#64;FieldOrder&#43;N&#39;)b ON &#39;&#43;&#64;Where1&#43;N&#39; &#39;&#43;&#64;Where2&#43;N&#39; &#39;&#43;&#64;FieldOrder)
END


推荐阅读
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 去掉空格的方法——Python工程师招聘标准与实践
    本文介绍了去掉空格的方法,并结合2019独角兽企业招聘Python工程师的标准与实践进行讨论。同时提供了一个转载链接,链接内容为更多相关信息。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
author-avatar
手机用户2602933853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有