而在sqlserver中,如果是sqlserver2000,用什么top... not in top...,效率又低,还需要有能标识记录的键,要求多高。
如果是sqlserver2005,好不容易出了个row_number,还一定需要order by,这不是画蛇添足,莫名其妙吗?难道按存在数据库中的自然顺序就不能分页取数据吗?
牢骚发完了,希望大家指点一下在sqlserver2005中如何快速地分页,谢谢。
11 个解决方案
#1
在sqlserver2005中如何快速地分页?
我就是用楼主看不起的 row_number 和 order by 啊.
我就是用楼主看不起的 row_number 和 order by 啊.
#2
没有看不起row_number ,而是看不起row_number 一定要加上order by
#3
难道按存在数据库中的自然顺序就不能分页取数据吗?
-----------------------------------------
你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??
-----------------------------------------
你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??
#4
同问
#5
需要自己写写分页的存储过程!
#6
--2005,通用存储过程!
create procedure [dbo].[Pagination](
@pagesize int, -- 页大小
@pageindex int, -- 当前页
@identity varchar(100), -- 唯一列
@cells varchar(1000)='*', -- 显示列
@tables varchar(1000), -- 表名称
@condition varchar(2000)=NULL, -- 查询条件
@top int = -1, --
@orderby varchar(200)=NULL -- 排序 desc
)
as
set nocount on
declare @rowcount int;
declare @SQL nvarchar(4000);
set @SQL = N'select @rowcount = count(0) from ' + @tables + ' where 1=1 ';
if(@condition IS NOT NULL) set @SQL = @SQL + @condition;
exec sp_executesql @SQL,N'@rowcount int output',@rowcount output;
if(@top != -1 and @rowcount > @top) set @rowcount = @top;
set @SQL = N'declare @___lb int;';
set @SQL = @SQL + N'declare @___ub int;';
set @SQL = @SQL + N'set @___lb=(@pageindex-1)*@pagesize;';
set @SQL = @SQL + N'set @___ub=@___lb+@pagesize;';
set @SQL = @SQL + N'set ROWCOUNT @___ub;';
set @SQL = @SQL + N'with ___t as (select *';
if(@orderby is not null and @orderby != '')
set @SQL = @SQL + N',row_number() over(order by ' + @orderby + ',' + @identity + ' asc) as ___p from (';
else
set @SQL = @SQL + N',row_number() over(order by ' + @identity + ' asc) as ___p from (';
if(@top != -1)
set @SQL = @SQL + N'select top ' + cast(@top as nvarchar(10)) + ' ';
else
set @SQL = @SQL + N'select ';
if(@cells IS NOT NULL)
set @SQL = @SQL + @cells;
else
set @SQL = @SQL + N'*';
set @SQL = @SQL + ' from ' + @tables + ' where 1=1';
if(@condition IS NOT NULL and @condition != '') set @SQL = @SQL + ' ' + @condition;
set @SQL = @SQL + ') as ___q) select * from ___t where ___p>@___lb and ___p<=@___ub;';
exec sp_executesql @SQL,N'@pagesize int,@pageindex int',@pagesize = @pagesize,@pageindex = @pageindex;
return @rowcount;
set nocount off
#7
难道按存在数据库中的自然顺序就不能分页取数据吗?
-----------------------------------------
你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??
======================================
可能这位老兄对我的“自然顺序”有误会,我指的是存放在数据表的顺序,也就是不刻意加上order by某个字段查出来的顺序。
难道我们每次查数据出来,都一定要加上order by?好像order by不是 select语法中的必需项吧?
但是用row_number这个查数据必须要order by,这不是画蛇添足?
-----------------------------------------
你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??
======================================
可能这位老兄对我的“自然顺序”有误会,我指的是存放在数据表的顺序,也就是不刻意加上order by某个字段查出来的顺序。
难道我们每次查数据出来,都一定要加上order by?好像order by不是 select语法中的必需项吧?
但是用row_number这个查数据必须要order by,这不是画蛇添足?
#8
ojuju10(永州之野产异蛇—永州异蛇!)
===================================
这位老兄的存储过程是一个分页的存储过程,但没有解决我的问题,我是想当SQL语句中,没有order by时,在sqlserver2005中如何用row_number分页取出数据?
因我写了一个通用显示数据组件,开发人员会向我这个组件传入各种SQL语句,并告诉我根据这条SQL语句取出第3到第8条记录,可能这条sql语句只是select A,B,C from table;这么简单的语句,但我没办法自动给它拼凑出分页的sql语句。因为它没有告诉我order by 哪个字段,根据row_number这个的要求,不能用它分页的,因为它一定要order by。
===================================
这位老兄的存储过程是一个分页的存储过程,但没有解决我的问题,我是想当SQL语句中,没有order by时,在sqlserver2005中如何用row_number分页取出数据?
因我写了一个通用显示数据组件,开发人员会向我这个组件传入各种SQL语句,并告诉我根据这条SQL语句取出第3到第8条记录,可能这条sql语句只是select A,B,C from table;这么简单的语句,但我没办法自动给它拼凑出分页的sql语句。因为它没有告诉我order by 哪个字段,根据row_number这个的要求,不能用它分页的,因为它一定要order by。
#9
如果大家还不清楚我的问题,http://topic.csdn.net/u/20080229/16/c4105263-4c8d-49cc-a77a-b22d9c6d53f9.html这里的楼主也碰到我同样问题,有空的可以看看。
#10
我理解你的意思,语法规定如此,我们没必要讨论它为什么这样,但结合实际应用,任何业务,查询出来的数据都肯定是有ORDER BY的,因为都会有排序的需求.
#11
我理解你的意思,语法规定如此,我们没必要讨论它为什么这样,但结合实际应用,任何业务,查询出来的数据都肯定是有ORDER BY的,因为都会有排序的需求.
==========================================
我知道sqlserver语法规定了这样,我们只有适应,但本来没必要加上这样限制,而且这个限制影响到我程序的灵活性,所以要抱怨几句。oracle,db2,mysql都没有加上这样的限制。
==========================================
我知道sqlserver语法规定了这样,我们只有适应,但本来没必要加上这样限制,而且这个限制影响到我程序的灵活性,所以要抱怨几句。oracle,db2,mysql都没有加上这样的限制。
#1
在sqlserver2005中如何快速地分页?
我就是用楼主看不起的 row_number 和 order by 啊.
我就是用楼主看不起的 row_number 和 order by 啊.
#2
没有看不起row_number ,而是看不起row_number 一定要加上order by
#3
难道按存在数据库中的自然顺序就不能分页取数据吗?
-----------------------------------------
你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??
-----------------------------------------
你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??
#4
同问
#5
需要自己写写分页的存储过程!
#6
--2005,通用存储过程!
create procedure [dbo].[Pagination](
@pagesize int, -- 页大小
@pageindex int, -- 当前页
@identity varchar(100), -- 唯一列
@cells varchar(1000)='*', -- 显示列
@tables varchar(1000), -- 表名称
@condition varchar(2000)=NULL, -- 查询条件
@top int = -1, --
@orderby varchar(200)=NULL -- 排序 desc
)
as
set nocount on
declare @rowcount int;
declare @SQL nvarchar(4000);
set @SQL = N'select @rowcount = count(0) from ' + @tables + ' where 1=1 ';
if(@condition IS NOT NULL) set @SQL = @SQL + @condition;
exec sp_executesql @SQL,N'@rowcount int output',@rowcount output;
if(@top != -1 and @rowcount > @top) set @rowcount = @top;
set @SQL = N'declare @___lb int;';
set @SQL = @SQL + N'declare @___ub int;';
set @SQL = @SQL + N'set @___lb=(@pageindex-1)*@pagesize;';
set @SQL = @SQL + N'set @___ub=@___lb+@pagesize;';
set @SQL = @SQL + N'set ROWCOUNT @___ub;';
set @SQL = @SQL + N'with ___t as (select *';
if(@orderby is not null and @orderby != '')
set @SQL = @SQL + N',row_number() over(order by ' + @orderby + ',' + @identity + ' asc) as ___p from (';
else
set @SQL = @SQL + N',row_number() over(order by ' + @identity + ' asc) as ___p from (';
if(@top != -1)
set @SQL = @SQL + N'select top ' + cast(@top as nvarchar(10)) + ' ';
else
set @SQL = @SQL + N'select ';
if(@cells IS NOT NULL)
set @SQL = @SQL + @cells;
else
set @SQL = @SQL + N'*';
set @SQL = @SQL + ' from ' + @tables + ' where 1=1';
if(@condition IS NOT NULL and @condition != '') set @SQL = @SQL + ' ' + @condition;
set @SQL = @SQL + ') as ___q) select * from ___t where ___p>@___lb and ___p<=@___ub;';
exec sp_executesql @SQL,N'@pagesize int,@pageindex int',@pagesize = @pagesize,@pageindex = @pageindex;
return @rowcount;
set nocount off
#7
难道按存在数据库中的自然顺序就不能分页取数据吗?
-----------------------------------------
你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??
======================================
可能这位老兄对我的“自然顺序”有误会,我指的是存放在数据表的顺序,也就是不刻意加上order by某个字段查出来的顺序。
难道我们每次查数据出来,都一定要加上order by?好像order by不是 select语法中的必需项吧?
但是用row_number这个查数据必须要order by,这不是画蛇添足?
-----------------------------------------
你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??
======================================
可能这位老兄对我的“自然顺序”有误会,我指的是存放在数据表的顺序,也就是不刻意加上order by某个字段查出来的顺序。
难道我们每次查数据出来,都一定要加上order by?好像order by不是 select语法中的必需项吧?
但是用row_number这个查数据必须要order by,这不是画蛇添足?
#8
ojuju10(永州之野产异蛇—永州异蛇!)
===================================
这位老兄的存储过程是一个分页的存储过程,但没有解决我的问题,我是想当SQL语句中,没有order by时,在sqlserver2005中如何用row_number分页取出数据?
因我写了一个通用显示数据组件,开发人员会向我这个组件传入各种SQL语句,并告诉我根据这条SQL语句取出第3到第8条记录,可能这条sql语句只是select A,B,C from table;这么简单的语句,但我没办法自动给它拼凑出分页的sql语句。因为它没有告诉我order by 哪个字段,根据row_number这个的要求,不能用它分页的,因为它一定要order by。
===================================
这位老兄的存储过程是一个分页的存储过程,但没有解决我的问题,我是想当SQL语句中,没有order by时,在sqlserver2005中如何用row_number分页取出数据?
因我写了一个通用显示数据组件,开发人员会向我这个组件传入各种SQL语句,并告诉我根据这条SQL语句取出第3到第8条记录,可能这条sql语句只是select A,B,C from table;这么简单的语句,但我没办法自动给它拼凑出分页的sql语句。因为它没有告诉我order by 哪个字段,根据row_number这个的要求,不能用它分页的,因为它一定要order by。
#9
如果大家还不清楚我的问题,http://topic.csdn.net/u/20080229/16/c4105263-4c8d-49cc-a77a-b22d9c6d53f9.html这里的楼主也碰到我同样问题,有空的可以看看。
#10
我理解你的意思,语法规定如此,我们没必要讨论它为什么这样,但结合实际应用,任何业务,查询出来的数据都肯定是有ORDER BY的,因为都会有排序的需求.
#11
我理解你的意思,语法规定如此,我们没必要讨论它为什么这样,但结合实际应用,任何业务,查询出来的数据都肯定是有ORDER BY的,因为都会有排序的需求.
==========================================
我知道sqlserver语法规定了这样,我们只有适应,但本来没必要加上这样限制,而且这个限制影响到我程序的灵活性,所以要抱怨几句。oracle,db2,mysql都没有加上这样的限制。
==========================================
我知道sqlserver语法规定了这样,我们只有适应,但本来没必要加上这样限制,而且这个限制影响到我程序的灵活性,所以要抱怨几句。oracle,db2,mysql都没有加上这样的限制。