关于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内部的存储过程,如果是其他数据库的话就要另外想办法了哦!
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内部的存储过程,如果是其他数据库的话就要另外想办法了哦!
相关文章推荐
- 关于SQL server查询的问题
- 关于Silverlight中的分页查询问题思考
- 关于mybatis中collection一对多关联查询分页出错问题总结
- 老生常谈:关于分页查询和性能问题
- 关于用分页提高查询速率的问题,是什么原理啊
- 老生常谈:关于分页查询和性能问题
- 关于SQL Server SQL语句查询分页数据的解决方案
- 关于SQL Server无法查询中文的问题
- 关于GridView查询后分页的问题
- SQL Server中分页查询和排序问题
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
- 关于用delphi查询oracle与mysql数据库的分页显示问题
- 关于Oracle分页查询的问题总结
- 关于getFetchSize()的问题及想要获取分页查询个数的方法
- 关于oracle的多表连接查询,分页的问题
- 关于mybatis中collection一对多关联查询分页出错问题总结
- 关于一个数据库分页查询的问题
- 关于时间段查询分页问题
- 关于SQL Server SQL语句查询分页数据的解决方案
- 关于分页查询问题