`
逆风的香1314
  • 浏览: 1432031 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分页查询

阅读更多

 

IF OBJECT_ID(N'dbo.p_show'IS NOT NULL
    
DROP PROCEDURE dbo.p_show
GO

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

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

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


/**//*--调用示例
EXEC dbo.p_show 
    @QueryStr = N'tb',
    @PageSize = 5,
    @PageCurrent = 3,
    @FdShow = 'id, colid, name',
    @FdOrder = 'colid, name'
select id, colid from tb
order by colid, name


EXEC dbo.p_show 
    @QueryStr = N'
SELECT TOP 100 PERCENT 
    * 
FROM dbo.sysobjects
ORDER BY xtype',
    @PageSize = 5,
    @PageCurrent = 2,
    @FdShow = 'name, xtype',
    @FdOrder = 'xtype, name'
--
*/

CREATE PROC dbo.p_show
    
@QueryStr nvarchar(4000),        -- 表名、视图名、查询语句
    @PageSize int=10,                -- 每页的大小(行数)
    @PageCurrent int=1,                -- 要显示的页
    @FdShow nvarchar (4000= N'',    -- 要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段
    @FdOrder nvarchar (1000= N''    -- 排序字段列表
AS
SET NOCOUNT ON
DECLARE
    
@FdName sysname,    --表中的主键或表、临时表中的标识列名
    @Id1 sysname,        --开始和结束的记录号
    @Id2 sysname,
    
@Obj_ID int            --对象ID

--表中有复合主键的处理
DECLARE
    
@strfd nvarchar(2000),        --复合主键列表
    @strjoin nvarchar(4000),    --连接字段
    @strwhere nvarchar(2000)    --查询条件


SELECT
    
@Obj_ID = OBJECT_ID(@QueryStr),
    
@FdShow = CASE 
                
WHEN @FdShow > N'' THEN N' ' + @FdShow
                
ELSE N' *'
            
END,
    
@FdOrder = CASE
                
WHEN @FdOrder > N'' THEN N' ORDER BY ' + @FdOrder
                
ELSE N' ' 
            
END,
    
@QueryStr = CASE
                
WHEN @Obj_ID IS NULL THEN N' (' + @QueryStr + N')A'
                
ELSE N' ' + @QueryStr
            
END

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

-- 如果是表, 则检查表中是否有标识更或主键
IF @Obj_ID IS NULL OR OBJECTPROPERTY(@Obj_ID'IsTable'= 0
    
GOTO lb_usetemp
ELSE
BEGIN
    
SELECT
        
@Id1 = CAST(@PageSize as varchar(20)),
        
@Id2 = CAST((@PageCurrent - 1* @PageSize as varchar(20))

    
-- 标识列
    SELECT
        
@FdName = name
    
FROM dbo.syscolumns
    
WHERE id = @Obj_ID
        
AND status = 0x80
    
IF @@ROWCOUNT = 0            --如果表中无标识列,则检查表中是否有主键
    BEGIN
        
DECLARE
            
@pk_number int

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

        
SELECT
            
@strfd = @strfd 
                    
+ N',' + QUOTENAME(name),
            
@strjoin = @strjoin 
                    
+ N' AND A.' + QUOTENAME(name) 
                    
+ N'=B.' +  QUOTENAME(name),
            
@strwhere = @strwhere 
                    
+ N' AND B.' + QUOTENAME(name) + N' IS NULL'
        
FROM(
            
SELECT
                IX.id, IX.indid,
                IXC.colid, ixc.keyno,
                C.name
            
FROM dbo.sysobjects O, 
                dbo.sysindexes IX,
                dbo.sysindexkeys IXC,
                dbo.syscolumns C
            
WHERE O.parent_obj = @Obj_ID
                
AND O.xtype = 'PK'
                
AND O.name = IX.name
                
AND IX.id = @Obj_ID
                
AND IX.id = IXC.id
                
AND IX.indid = IXC.indid
                
AND IXC.id = C.id
                
AND IXC.colid = C.colid
        )A
        
ORDER BY keyno

        
SELECT
            
@pk_number = @@ROWCOUNT,            
            
@strfd = STUFF(@strfd11, N''),
            
@strjoin = STUFF(@strjoin15, N''),
            
@strwhere = STUFF(@strwhere15, N'')            

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

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

/**//*--表中有复合主键的处理方法--*/
lb_usepk:        
EXEC(N'
分享到:
评论

相关推荐

    SQLite 查询所有 分页查询 查询个数

    在处理大量数据时,为了提高效率并避免一次性加载所有数据导致性能下降,通常会采用分页查询的方式来获取数据。下面我们将详细探讨SQLite中的查询所有、分页查询以及查询个数的相关知识点。 1. 查询所有数据: 在...

    hbase分页查询实现.pdf

    HBase分页查询实现 HBase作为一个NoSQL数据库,具有高性能、高可扩展性和高可靠性等特点,但是在查询方面却存在一些限制,例如不支持分页查询。这就使得开发者需要自己实现分页查询功能。本文将讲解如何使用Java...

    基于springmvc实现分页查询

    本篇文章将详细探讨如何基于Spring MVC实现分页查询,这对于任何处理大量数据的Web应用都是至关重要的。 首先,理解分页的基本概念。分页是将大型数据集划分为较小、更易管理的部分,以提高用户体验并减少服务器...

    Android开发之数据库的分页查询代码

    在Android应用开发中,数据库是数据存储的重要方式,特别是在处理大量数据时,为了提高用户体验,分页查询就显得尤为重要。本篇文章将详细讲解如何在Android中实现数据库的分页查询功能,以高效、流畅地加载和展示...

    完美解决MybatisPlus插件分页查询不起作用总是查询全部数据问题

    在开始解决分页查询问题之前,我们先来了解一下MyBatis Plus的基本概念。MyBatis Plus的核心组件之一是PaginationInterceptor,这是一个分页拦截器,它负责在执行SQL时自动添加分页条件。在不启用这个拦截器的情况下...

    JPA分页查询与条件分页查询

    在这个场景中,我们将探讨如何使用JPA进行分页查询以及带有条件的分页查询。 首先,为了使用Spring Data JPA,我们需要在项目中引入相应的依赖。在Maven的pom.xml文件中,你需要添加`spring-boot-starter-data-jpa`...

    JPA复杂查询加分页查询的快速开发

    JPA复杂查询加分页查询的快速开发 JPA(Java Persistence API)是 Java 的持久层 API,用于访问、持久化数据。使用 JPA,可以快速开发复杂查询,实现高效的数据访问。下面是 JPA 复杂查询加分页查询的快速开发知识...

    java多线程分页查询

    ### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...

    winform高效率的分页查询

    本话题聚焦于“winform高效率的分页查询”,我们将探讨如何在VS2013环境下,结合SQL Server 2008数据库,实现高效的数据分页加载到`DataGridView`中。 首先,理解分页查询的原理至关重要。在大数据量的情况下,一次...

    oracle分页查询sql

    ### Oracle分页查询详解 #### 一、分页查询的重要性 在数据库操作中,分页查询是一项非常重要的技术。尤其当处理大量数据时,一次性获取所有数据不仅会消耗大量的网络带宽,还可能导致前端页面加载缓慢,用户体验...

    Jsp+Servlet+MyBatis完成分页查询

    在本文中,我们将深入探讨如何使用JSP、Servlet和MyBatis这三种技术来实现一个分页查询的功能。这是一个常见的需求,在许多Web应用程序中,为了提高用户体验,通常需要将大量数据分批次展示,而不是一次性加载所有...

    大数据量多线程执行分页查询

    多线程技术与分页查询相结合,可以有效地解决这一问题,提高系统性能并优化用户体验。以下是对标题和描述中涉及知识点的详细解释: 1. **大数据量处理**:当数据库中的数据达到百万甚至亿级时,单线程查询可能导致...

    PB 做的分页查询24行一页

    标题中的“PB 做的分页查询24行一页”指的是使用PowerBuilder(PB)这一编程工具进行数据库查询时实现的分页功能。在数据库交互中,分页查询是常用的技术,它允许用户逐页浏览大量数据,而不是一次性加载所有记录,...

    oracle分页查询并返回总记录数据存储过程

    ### Oracle 分页查询并返回总记录数据存储过程 在数据库应用开发中,为了提高用户体验以及减少服务器负担,分页查询成为了一种常见的技术手段。Oracle 数据库提供了多种方法来实现分页查询,其中使用存储过程是一种...

    java语言的分页查询功能(mysql和sql server)

    在Java编程中,分页查询是一项非常重要的功能,特别是在处理大量数据时,它能有效地减少内存负担,提高应用性能。本教程将详细讲解如何在Java中实现不分框架的分页查询,同时涵盖对MySQL和SQL Server数据库的支持。 ...

    springmvc+mybatis+分页查询

    在本项目中,我们主要探讨的是如何利用Spring MVC和MyBatis两大流行框架构建一个具有分页查询功能的Web应用。Spring MVC作为控制层,负责处理HTTP请求和响应,而MyBatis则作为数据访问层,用于处理数据库交互。下面...

    ArcGIS API for Flex 2.0开发应用之分页查询

    ArcGIS API for Flex 2.0开发应用之分页查询 在GIS应用系统中,对GIS数据进行分页查询一直是一个亟待解决的问题。传统的WEB开发中,分页查询数据库已经是一个历史悠久的功能,但是在GIS应用系统中,这个简单的分页...

    JavaWeb实现分页查询案例

    在JavaWeb开发中,分页查询是一个非常常见的需求,它能有效地提高网页加载速度,提升用户体验。本案例通过原生的PageBean实现分页查询,采用JDBC(Java Database Connectivity)进行数据库操作,Servlet作为控制层...

    千万级数据分页查询存储过程SQLServer

    在SQL Server中,面对千万级别的大数据量,进行有效的分页查询是数据库性能优化的重要环节。存储过程在这种场景下显得尤为重要,因为它们可以提高查询效率,减少网络传输,并且便于管理和重用代码。本文将深入探讨...

    实现分页查询(上)

    在网页开发中,分页查询是一项非常重要的技术,它能够帮助用户有条不紊地浏览大量数据,提高用户体验,同时也减轻了服务器一次性处理过多数据的压力。本篇文章将深入探讨分页查询的概念、实现原理以及常见方法,以...

Global site tag (gtag.js) - Google Analytics