分页查询

原创 2007年09月25日 15:08:00
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetPaginationDataByKey]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[GetPaginationDataByKey]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO





/*


通用分页查询存储过程(按唯一键分页)
 

用法:

exec GetPaginationDataByKey @nvcharTable,@nvcharKeyField,@nvcharWhere,@nvcharSort,
    @bitNoPage,@intPageSize,@intPageNo,@bitReturnAllOnFail,@intTotalCount output

    
DECLARE @intTotalCountReturn int

exec GetPaginationDataByKey 'ForumTopic','ID','',' ReplyCount DESC',
    0,5,2,0,@intTotalCount = @intTotalCountReturn output

PRINT @intTotalCountReturn

*/


CREATE PROCEDURE dbo.GetPaginationDataByKey
(
@nvcharTable nvarchar(500),            --要查询的表名或视图名称
@nvcharKeyField nvarchar(200),            --表或视图中唯一标识记录的字段名称
@nvcharWhere nvarchar(2000),            --Where子句
@nvcharSort nvarchar(2000),            --ORDER BY子句
@bitNoPage bit,                    --是否需要分页返回        0:是    1:否
@intPageSize int,                --每页数量
@intPageNo int,                    --当前页码
@bitReturnAllOnFail bit,                --当参数不合法时,是否所有数据    1:是    0:否
@intTotalCount int output            --所有符合条件的记录数量
)
AS

SET XACT_ABORT ON
SET NOCOUNT ON

--修订表名
DECLARE @nvcharTableNew nvarchar(500)
IF@nvcharTable <> ''
BEGIN
    
SET @nvcharTableNew = ' [' +  @nvcharTable  + ']'
END
ELSE
BEGIN
    
SET @nvcharTableNew = ''
END

--修订Where语句
DECLARE @nvcharWhereNew nvarchar(2000)
IF(@nvcharWhere<> ''
    
SET @nvcharWhereNew = ' WHERE ( ' +  @nvcharWhere  + ' ) '
ELSE
    
SET @nvcharWhereNew = ' WHERE 1 = 1 '

--修订排序语句
DECLARE @nvcharSortNew nvarchar(2000)
IF(@nvcharSort  <> '')
BEGIN
    
SET @nvcharSortNew = ' ORDER BY ' +  @nvcharSort 
END
ELSE
BEGIN
    
SET @nvcharSortNew = ''
END

--修订关键字段
DECLARE @nvcharKeyFieldNew nvarchar(200)
IF(@nvcharKeyField <> '')
BEGIN
    
SET @nvcharKeyFieldNew = '[' + @nvcharKeyField + ']'
END
ELSE
BEGIN
    
SET @nvcharKeyFieldNew = ''
END


--记录总数
DECLARE @QueryCountString NVARCHAR(4000)
SET @QueryCountString = 'SELECT @intTotal = COUNT(*) FROM ' + @nvcharTableNew + @nvcharWhereNew
execute sp_executesql @QueryCountString,
            N
'@nvcharTableNew nvarchar(2000), @nvcharWhereNew nvarchar(2000),@intTotal int output',
                   
@nvcharTableNew@nvcharWhereNew,@intTotalCount output

--如果不分页时返回所有
IF(@bitNoPage = 1)
BEGIN
    
EXEC('SELECT * FROM ' + @nvcharTableNew + @nvcharWhereNew + @nvcharSortNew)
    
RETURN
END

--参数不合法按要求返回空数据集或所有数据
IF(@intPageSize <= 0 OR @intPageNo < 1 OR @nvcharSortNew = '' OR @nvcharKeyFieldNew = '')
BEGIN
    
IF(@bitReturnAllOnFail = 0)
    
BEGIN
        
EXEC('SELECT Top 0 * FROM ' + @nvcharTableNew)
    
END
    
ELSE
    
BEGIN
        
EXEC('SELECT * FROM ' + @nvcharTableNew + @nvcharWhereNew + @nvcharSortNew)
    
END

    
RETURN 
END

--查询语句
DECLARE @nvcharSql nvarchar(4000)
    
SET @nvcharSql = 
    
' SELECT Top ' + CONVERT(nvarchar(200),@intPageSize+ ' * FROM ' + @nvcharTableNew +  @nvcharWhereNew
    
+ ' AND '
    
+ @nvcharKeyFieldNew + ' NOT IN (' 
    
+ ' SELECT Top ' + CONVERT(nvarchar(200),@intPageSize * (@intPageNo - 1)) + ' ' + @nvcharKeyFieldNew + ' FROM ' + @nvcharTableNew + @nvcharWhereNew + @nvcharSortNew
    
+ ' ) '
    
+ @nvcharSortNew

execute sp_executesql @nvcharSql,
    N
'@intPageSize int,@nvcharTableNew nvarchar(500),@nvcharWhereNew nvarchar(2000), @nvcharKeyFieldNew nvarchar(200),@intPageNo int,@nvcharSortNew nvarchar(2000)',
    
@intPageSize,@nvcharTableNew,@nvcharWhereNew,@nvcharKeyFieldNew,@intPageNo,@nvcharSortNew

SET NOCOUNT OFF



GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

--SQL 2005

WITH TempQuery AS
(
    
SELECT {0}, ROW_NUMBER() OVER (ORDER BY {3}) AS 'RowNumberForSplit'
    
FROM {1}
    
WHERE 1 = 1 {2}
)
SELECT * 
FROM TempQuery 
WHERE RowNumberForSplit BETWEEN {4AND {5};


 

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

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

详述 DB2 分页查询及 Java 实现

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

Hbase分页查询代码实现

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

分页查询实例

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

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
  • 31564

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

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

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

要在web页面显示分页后的学生信息,首先我们在navicat创建一个学生信息表 ,在这里我在表里插入了30 条数据1,创建Student实体类package com.lanou.controller;...
  • dxr970110
  • dxr970110
  • 2017年07月26日 21:21
  • 256

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

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

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

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

Mybatis实现真正分页查询

Mybatis实现真正分页查询 MyBatis 本身是有分页查询的但是并不是真正的分页查询。它是先把数据查出来放在内存里面你要什么给你什么。 和真正的分页查询还是不一样的。如果数据太多的话。内存肯...
  • qq_28601235
  • qq_28601235
  • 2015年08月23日 20:25
  • 16339
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分页查询
举报原因:
原因补充:

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