9月21
最近在使用SQL查询数据库,做个小程序,但是在做到显示的时候遇到了个小问题:SQL Server没有分页的功能,只能自己写了。百度GOOGLE了一下,找了几个常用的方法,用起来效果还不错,分别是使用TOP关键词来对SQL Server进行分页操作,使用存储过程来对Sql Server来进行分页操作和使用上次读取的结果来进行操作。
详细记录如下,希望对大家有用:)
方法一:SQL查询分页
引用
select top 10 * from basicinfor where eid not in (select top 20 eid from basicinfor order by ename) order by ename
其中 10: 是 你每页显示的行数 ,可以通过参数获得。
后面的20: 是10×2(2 是第几页)得到的。
这句的sql 查询 其实 就是 每页10条记录的第3页记录打印出来的sql 语句。
还要提醒下 ,如果查询带条件 后面的子查询也要带上条件:
select top 10 * from basicinfor where ename like '%albaba%' and eid not in (select top 20 eid from basicinfor where ename like '%albaba%' order by ename) order by ename
这样查询出来的数据只有10条,效率远远大于 网上一般的 查询出所有记录然后在list 里面遍历出 想要的10条记录 效率要大的多,特别是在表中数据多的情况下 。
原文:http://blog.csdn.net/lioushuei/archive/2009/01/14/3777318.aspx
方法二:使用存储过程
引用
CREATE PROC Turnpage
@qCols varchar(200), --需要查询的列
@qTables varchar(200), --需要查询的表 和条件
@iKey varchar (20), --标识字段
@oKey varchar(20), --排序字段
@pageSize int, --每页的行数
@pageNumber int --要显示的页码, 从0开始
AS
set nocount on
BEGIN
DECLARE @sqlText AS varchar(1000)
DECLARE @sqlTable AS varchar(1000)
SET @sqlTable = 'SELECT TOP ' + CAST((@pageNumber + 1) * @pageSize AS varchar(30)) + ' ' + @qCols +' from '+ @qTables + ' order by '+@oKey+ ' desc'
SET @sqlText =
'SELECT TOP ' + CAST(@pageSize AS varchar(30)) + ' * ' +
'FROM (' + @sqlTable + ') AS tableA ' +
'WHERE ' + @iKey + ' NOT IN(SELECT TOP ' +
CAST(@pageNumber * @pageSize AS varchar(30)) + ' ' + @iKey +
' FROM (' + @sqlTable + ') AS tableB)'
EXEC (@sqlText)
--print(@sqltext)
END
GO
原文:http://blogger.org.cn/blog/more.asp?name=dml&id=25237
方法3:记录上次读取的记录
引用
sqlserver中没有类似oralce中的伪列。所以不能用这个属性来进行分页。
这是我最近搞的一个关于sqlserver的分页,不知道对你有没有帮助:
我们知道,sqlserver中,top关键字是用来取前n条记录的。如果想得到查询结果集中的前20条数据,则sql语句如下:
select top 20 * from x_user ;
方法1:
对于一般的表,id都是基于一种规则顺序往下走的。一般情况下,是自动增一的。这里也就只能讨论这种情况,对于个别的情况,如果以后项目遇到了,我会再继续玩玩得。不过对于目前绝大多数的id自增的情况是适用的。所以,我们可以钻一个空子:
select top 20 * from x_user order by uid ;
这样,就可以根据uid来排序进行取数据的操作。这是第一页的情况。由于id是自增的,所以第二页的第一条记录的id肯定比上一页的大。并且都是顺序排列的。因此,第二页的sql可以如下表示:
select top 20 * from x_user where uid > 上一页最后的id order by uid ;
第三页,第四页...... 以此类推。只要找到上一页的最后一个id就行了。
哈哈。相当简单的吧。这是下一页的操作。至于上一页,用法是一样的。不过这里需要注意的是:上一页的条数的那个id需要减去2倍的每页显示条数。这是为什么呢?
举例说明:
1,2,3,4,5 第一页 最后的id = 5
6,7,8,9,10 第二页 最后的id = 10
11,12,13,14 ,15 第三页 最后的id = 15
我们从第一页翻到第二页的sql是:select top 20 * from x_user where uid > 5 order by uid ;记住,这个id是5!!
假如我们从第三页想返回第二页。第三页的最后一个id是15。所以15-5=10 。正好是每页显示条数的2倍。
换句话说,从第三页返回到第二页,这个sql语句中的id其实记录的是第一页的最后一个id。所以需要减去2倍的每页显示条数。
方法2 :
用between ... and ... 关键字。
select top 20 * from x_user where uid between 10 and 20 order by uid;
这样直接就能得到啦。省事吧?不过这2种都仅限于id是那种规则自增的方式。如果你非要搞个随机数,日期什么的。恐怕就不行了。不过谁还用那玩意啊?对于绝大多数的项目都好使就行啊。哈哈
原文:http://blog.csdn.net/afterRain/archive/2008/05/08/2417090.aspx
作者:Lewen@博雅宇轩
地址:http://www.lewensky.cn/read.php/340.htm
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
Bopup scanner 2.13 汉化绿色免费版(小巧实用的网络扫描
Maxthon2.5.8.1332苦菜花增强优化防假死版(0921)(安


