`
- 浏览:
2307902 次
-
IFOBJECT_ID(N'dbo.p_show')ISNOTNULL
DROPPROCEDUREdbo.p_show
GO


/**//*--实现分页的通用存储过程

显示指定表、视图、查询结果的第X页
对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
如果视图或查询结果中有主键,不推荐此方法
如果使用查询语句,而且查询语句使用了orderby,则查询语句必须包含top语句

最后更新时间:2008.01.20
--邹建2003.09(引用请保留此信息)--*/


/**//*--调用示例
EXECdbo.p_show
@QueryStr=N'tb',
@PageSize=5,
@PageCurrent=3,
@FdShow='id,colid,name',
@FdOrder='colid,name'
selectid,colidfromtb
orderbycolid,name


EXECdbo.p_show
@QueryStr=N'
SELECTTOP100PERCENT
*
FROMdbo.sysobjects
ORDERBYxtype',
@PageSize=5,
@PageCurrent=2,
@FdShow='name,xtype',
@FdOrder='xtype,name'
--*/
CREATEPROCdbo.p_show
@QueryStrnvarchar(4000),--表名、视图名、查询语句
@PageSizeint=10,--每页的大小(行数)
@PageCurrentint=1,--要显示的页
@FdShownvarchar(4000)=N'',--要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段
@FdOrdernvarchar(1000)=N''--排序字段列表
AS
SETNOCOUNTON
DECLARE
@FdNamesysname,--表中的主键或表、临时表中的标识列名
@Id1sysname,--开始和结束的记录号
@Id2sysname,
@Obj_IDint--对象ID

--表中有复合主键的处理
DECLARE
@strfdnvarchar(2000),--复合主键列表
@strjoinnvarchar(4000),--连接字段
@strwherenvarchar(2000)--查询条件


SELECT
@Obj_ID=OBJECT_ID(@QueryStr),
@FdShow=CASE
WHEN@FdShow>N''THENN''+@FdShow
ELSEN'*'
END,
@FdOrder=CASE
WHEN@FdOrder>N''THENN'ORDERBY'+@FdOrder
ELSEN''
END,
@QueryStr=CASE
WHEN@Obj_IDISNULLTHENN'('+@QueryStr+N')A'
ELSEN''+@QueryStr
END

--如果显示第一页,可以直接用top来完成
IF@PageCurrent=1
BEGIN
SELECT
@Id1=CAST(@PageSizeasvarchar(20))
EXEC(N'
SELECTTOP'+@Id1+N'
'+@FdShow+N'
FROM'+@QueryStr+N'
'+@FdOrder
)
RETURN
END

--如果是表,则检查表中是否有标识更或主键
IF@Obj_IDISNULLOROBJECTPROPERTY(@Obj_ID,'IsTable')=0
GOTOlb_usetemp
ELSE
BEGIN
SELECT
@Id1=CAST(@PageSizeasvarchar(20)),
@Id2=CAST((@PageCurrent-1)*@PageSizeasvarchar(20))

--标识列
SELECT
@FdName=name
FROMdbo.syscolumns
WHEREid=@Obj_ID
ANDstatus=0x80
IF@@ROWCOUNT=0--如果表中无标识列,则检查表中是否有主键
BEGIN
DECLARE
@pk_numberint

SELECT
@strfd=N'',
@strjoin=N'',
@strwhere=N''

SELECT
@strfd=@strfd
+N','+QUOTENAME(name),
@strjoin=@strjoin
+N'ANDA.'+QUOTENAME(name)
+N'=B.'+QUOTENAME(name),
@strwhere=@strwhere
+N'ANDB.'+QUOTENAME(name)+N'ISNULL'
FROM(
SELECT
IX.id,IX.indid,
IXC.colid,ixc.keyno,
C.name
FROMdbo.sysobjectsO,
dbo.sysindexesIX,
dbo.sysindexkeysIXC,
dbo.syscolumnsC
WHEREO.parent_obj=@Obj_ID
ANDO.xtype='PK'
ANDO.name=IX.name
ANDIX.id=@Obj_ID
ANDIX.id=IXC.id
ANDIX.indid=IXC.indid
ANDIXC.id=C.id
ANDIXC.colid=C.colid
)A
ORDERBYkeyno

SELECT
@pk_number=@@ROWCOUNT,
@strfd=STUFF(@strfd,1,1,N''),
@strjoin=STUFF(@strjoin,1,5,N''),
@strwhere=STUFF(@strwhere,1,5,N'')

IF@pk_number=0
GOTOlb_usetemp--如果表中无主键,则用临时表处理
ELSEIF@pk_number=1
BEGIN
SELECT
@FdName=@strfd
GOTOlb_useidentity--使用单一主键
END
ELSE
GOTOlb_usepk--使用复合主键
END
END


/**//*--使用标识列或主键为单一字段的处理方法--*/
lb_useidentity:
EXEC(N'
SELECTTOP'+@Id1+N'
'+@FdShow+N'
FROM'+@QueryStr+N'
WHERE'+@FdName+'NOTIN(
SELECTTOP'+@Id2+N'
'+@FdName+'
FROM'+@QueryStr+N'
'+@FdOrder+N')
'+@FdOrder+N'
')
RETURN


/**//*--表中有复合主键的处理方法--*/
lb_usepk:
EXEC(N'
SELECT
'+@FdShow+N'
FROM(
SELECTTOP'+@Id1+N'
A.*
FROM'+@QueryStr+N'A
LEFTJOIN(
SELECTTOP'+@Id2+N'
'+@strfd+N'
FROM'+@QueryStr+N'
'+@FdOrder+N'
)B
ON'+@strjoin+N'
WHERE'+@strwhere+N'
'+@FdOrder+N'
)A
'+@FdOrder+N'
')
RETURN


/**//*--用临时表处理的方法--*/
lb_usetemp:
SELECT
@FdName=QUOTENAME(N'ID_'+CAST(NEWID()asvarchar(40))),
@Id1=CAST(@PageSize*(@PageCurrent-1)asvarchar(20)),
@Id2=CAST(@PageSize*@PageCurrent-1asvarchar(20))

EXEC(N'
SELECT
'+@FdName+N'=IDENTITY(int,0,1),
'+@FdShow+N'
INTO#tb
FROM(
SELECTTOP100PERCENT
*
FROM'+@QueryStr+N'
'+@FdOrder+N'
)A
'+@FdOrder+N'

SELECT
'+@FdShow+N'
FROM#tb
WHERE'+@FdName+'BETWEEN'+@Id1+'AND'+@Id2+N'
'
)
GO
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
在处理大量数据时,为了提高效率并避免一次性加载所有数据导致性能下降,通常会采用分页查询的方式来获取数据。下面我们将详细探讨SQLite中的查询所有、分页查询以及查询个数的相关知识点。 1. 查询所有数据: 在...
HBase分页查询实现 HBase作为一个NoSQL数据库,具有高性能、高可扩展性和高可靠性等特点,但是在查询方面却存在一些限制,例如不支持分页查询。这就使得开发者需要自己实现分页查询功能。本文将讲解如何使用Java...
在这个场景中,我们将探讨如何使用JPA进行分页查询以及带有条件的分页查询。 首先,为了使用Spring Data JPA,我们需要在项目中引入相应的依赖。在Maven的pom.xml文件中,你需要添加`spring-boot-starter-data-jpa`...
本篇文章将详细探讨如何基于Spring MVC实现分页查询,这对于任何处理大量数据的Web应用都是至关重要的。 首先,理解分页的基本概念。分页是将大型数据集划分为较小、更易管理的部分,以提高用户体验并减少服务器...
在Android应用开发中,数据库是数据存储的重要方式,特别是在处理大量数据时,为了提高用户体验,分页查询就显得尤为重要。本篇文章将详细讲解如何在Android中实现数据库的分页查询功能,以高效、流畅地加载和展示...
在IT领域,数据库操作是至关重要的,特别是在处理大量数据时,分页查询是提高系统性能、优化用户体验的有效手段。易语言作为一款中国本土化的编程语言,提供了与MySQL数据库交互的能力,使得开发者能够轻松实现...
在开始解决分页查询问题之前,我们先来了解一下MyBatis Plus的基本概念。MyBatis Plus的核心组件之一是PaginationInterceptor,这是一个分页拦截器,它负责在执行SQL时自动添加分页条件。在不启用这个拦截器的情况下...
JPA复杂查询加分页查询的快速开发 JPA(Java Persistence API)是 Java 的持久层 API,用于访问、持久化数据。使用 JPA,可以快速开发复杂查询,实现高效的数据访问。下面是 JPA 复杂查询加分页查询的快速开发知识...
### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...
### 解决Oracle分页查询中排序与效率问题 在Oracle数据库中进行分页查询时,经常会出现性能瓶颈,尤其是在处理大数据量的情况下。本篇文章将详细探讨如何优化Oracle分页查询中的排序与效率问题。 #### 一、理解...
本话题聚焦于“winform高效率的分页查询”,我们将探讨如何在VS2013环境下,结合SQL Server 2008数据库,实现高效的数据分页加载到`DataGridView`中。 首先,理解分页查询的原理至关重要。在大数据量的情况下,一次...
### Oracle分页查询详解 #### 一、分页查询的重要性 在数据库操作中,分页查询是一项非常重要的技术。尤其当处理大量数据时,一次性获取所有数据不仅会消耗大量的网络带宽,还可能导致前端页面加载缓慢,用户体验...
标题中的“PB 做的分页查询24行一页”指的是使用PowerBuilder(PB)这一编程工具进行数据库查询时实现的分页功能。在数据库交互中,分页查询是常用的技术,它允许用户逐页浏览大量数据,而不是一次性加载所有记录,...
在本文中,我们将深入探讨如何使用JSP、Servlet和MyBatis这三种技术来实现一个分页查询的功能。这是一个常见的需求,在许多Web应用程序中,为了提高用户体验,通常需要将大量数据分批次展示,而不是一次性加载所有...
多线程技术与分页查询相结合,可以有效地解决这一问题,提高系统性能并优化用户体验。以下是对标题和描述中涉及知识点的详细解释: 1. **大数据量处理**:当数据库中的数据达到百万甚至亿级时,单线程查询可能导致...
### Oracle 分页查询并返回总记录数据存储过程 在数据库应用开发中,为了提高用户体验以及减少服务器负担,分页查询成为了一种常见的技术手段。Oracle 数据库提供了多种方法来实现分页查询,其中使用存储过程是一种...
在Java编程中,分页查询是一项非常重要的功能,特别是在处理大量数据时,它能有效地减少内存负担,提高应用性能。本教程将详细讲解如何在Java中实现不分框架的分页查询,同时涵盖对MySQL和SQL Server数据库的支持。 ...
在本项目中,我们主要探讨的是如何利用Spring MVC和MyBatis两大流行框架构建一个具有分页查询功能的Web应用。Spring MVC作为控制层,负责处理HTTP请求和响应,而MyBatis则作为数据访问层,用于处理数据库交互。下面...
ArcGIS API for Flex 2.0开发应用之分页查询 在GIS应用系统中,对GIS数据进行分页查询一直是一个亟待解决的问题。传统的WEB开发中,分页查询数据库已经是一个历史悠久的功能,但是在GIS应用系统中,这个简单的分页...
在JavaWeb开发中,分页查询是一个非常常见的需求,它能有效地提高网页加载速度,提升用户体验。本案例通过原生的PageBean实现分页查询,采用JDBC(Java Database Connectivity)进行数据库操作,Servlet作为控制层...