分页查询

原创 2003年12月29日 17:29:00

 

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'
SELECT 
    
' + @FdShow + N'
FROM(
    SELECT TOP 
' + @Id1 + N'
        A.*
    FROM 
' + @QueryStr + N' A
        LEFT JOIN(
                SELECT TOP 
' + @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() as varchar(40))),
    
@Id1 = CAST(@PageSize * (@PageCurrent-1as varchar(20)),
    
@Id2 = CAST(@PageSize * @PageCurrent-1 as varchar(20))

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

SELECT 
    
' + @FdShow + N'
FROM #tb 
WHERE 
' + @FdName + ' BETWEEN ' + @Id1 + ' AND ' + @Id2 + N'
'
)
GO

分页查询实例

分页查询实例
  • myitec
  • myitec
  • 2015年12月01日 02:32
  • 670

Hbase分页查询代码实现

全部写在一起了, 后期可以分离优化一下 各个方法 package com.ruif.hbase.dao; import java.io.IOException; import java.util....
  • a2615381
  • a2615381
  • 2016年09月05日 18:14
  • 2004

详述 DB2 分页查询及 Java 实现

在整改数据库敏感信息加密时,需要对已存数据进行处理,如果直接用 select * from tableName 很容易出现问题,因此选择分页查询,批量处理数据。...
  • qq_35246620
  • qq_35246620
  • 2017年09月10日 14:55
  • 1289

三种SQL分页查询的存储过程代码

--根据MAX(MIN)ID CREATE PROC [dbo].[proc_select_id] @pageindex int=1,--当前页数 @pagesize int=10,--每...
  • Denghejing
  • Denghejing
  • 2014年11月10日 16:14
  • 1277

Hibernate入门实例——Hibernate分页查询

package com.metis.hibernate.test; import java.util.Iterator; import java.util.List; impo...
  • weoln
  • weoln
  • 2010年08月29日 13:11
  • 3400

项目中不可缺少的分页查询方法

分页查询,每个项目里必不可少的,封装好的方法在网上也是很多的,不管是B/S还是C/S项目,底层的方法写的都是大同小异的,所以为了提高效率,我们总是将最快的实现方法拿过来。         因为公司之前...
  • u010785685
  • u010785685
  • 2015年10月28日 19:38
  • 887

android分页查询获取系统联系人信息

package com.example.yqqmobilesafe.ContactProvider; import java.util.ArrayList; import java.util.Lis...
  • u014600432
  • u014600432
  • 2014年11月24日 09:58
  • 1815

SSH分页(Hibernate实现简单分页查询)

直接正题 一、INewsDao.java(DAO接口):  1 package cn.dy.dao;  2   3 import java.util.List;  4 impor...
  • kalision
  • kalision
  • 2015年07月08日 13:19
  • 31457

Mybatis实现真正分页查询

Mybatis实现真正分页查询 MyBatis 本身是有分页查询的但是并不是真正的分页查询。它是先把数据查出来放在内存里面你要什么给你什么。 和真正的分页查询还是不一样的。如果数据太多的话。内存肯...
  • qq_28601235
  • qq_28601235
  • 2015年08月23日 20:25
  • 16302

一个 JDBC 实现对 mysql 进行分页查询的 实例

要在web页面显示分页后的学生信息,首先我们在navicat创建一个学生信息表 ,在这里我在表里插入了30 条数据1,创建Student实体类package com.lanou.controller;...
  • dxr970110
  • dxr970110
  • 2017年07月26日 21:21
  • 250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分页查询
举报原因:
原因补充:

(最多只允许输入30个字)