您的位置:首页 > 数据库

关于sql server分页查询的问题

2007-03-24 00:04 281 查看
1.通过sql语句实现查询分页,比如想访问Northwind数据库里Orders表,假如外面页面显示是每页10行,想获得第2页的数据,也就是11-20行 ,可以通过如下sql语句

select * from Orders where OrderID in(
select top 10 OrderID from Orders where OrderID in(select top 20 OrderID from Orders order by OrderID asc) order by OrderID desc)
order by OrderID asc

首先看红色部分 查询前20个OrderID,并以OrderID进行顺序排序,注意OrderID是主键,这里最好是主键,因为主键查询速度是最快的,用的是索引查询。

然后看蓝色和红色部分,当红色部分查询了前20个记录的主键,那么蓝色代码就在这20里查询出后10个,查询出的结果同样是OrderID主键

最后在看外面的代码,查询出你想查询的字段,在这里查的是*,这样就可以查询出11-20行记录

这种查询方法速度很快,因为sql查询优化器完全懂得怎么做,里面查询全部是基于索引查询,各种各样的数据库都可以用这种方法,就是代码比较复杂,如果基本查询本身就很复杂了,那么查询代码就不怎么好写了

2.通过存储过程实现查询分页,同样是访问NorthWind数据的Orders表的11-20行记录

首先建立如下代理存储过程

create procedure up_zbh_DivPageBySql
@strSql varchar(8000),
@nPageSize int,
@nPageCount int
as
SET NOCOUNT ON
DECLARE @P1 INT,
@nRowCount INT

EXEC sp_cursoropen @P1 OUTPUT, @strSql, @scrollopt = 2, @ccopt = 335873, @rowcount = @nRowCount OUTPUT

IF (@P1 != 0)
BEGIN
@nPageCount AS nPage
SET @nPageCount = (@nPageCount - 1) * @nPageSize + 1
EXEC sp_cursorfetch @P1, 32, @nPageCount, @nPageSize
EXEC sp_cursorclose @P1
END
go

然后在在基于这个存储过程建立真正要用的存储过程,如下

create proc proc_SearchOrders

@pageSize int --每页列数

@pageIndex int --第几页

as

begin

up_zbh_DivPageBySql 'select * from Orders',@pageSize,@pageIndex

end

这个查询存储过程会返回2张表,第一张是空表,取第2张就行了。改查询速度也非常快,而且操作也简单,适合常规使用,但是只能在sql server使用,因为查询的核心代码全部是调用的sql内部的存储过程,如果是其他数据库的话就要另外想办法了哦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: