SQLSERVER怎么就不能好好地解决一下分页问题呢?

时间:2021-07-06 06:37:34
在mysql,oracle,db2等等数据库中,做一个分页取数据是那么的容易。
而在sqlserver中,如果是sqlserver2000,用什么top... not in top...,效率又低,还需要有能标识记录的键,要求多高。
                  如果是sqlserver2005,好不容易出了个row_number,还一定需要order by,这不是画蛇添足,莫名其妙吗?难道按存在数据库中的自然顺序就不能分页取数据吗?
牢骚发完了,希望大家指点一下在sqlserver2005中如何快速地分页,谢谢。

11 个解决方案

#1


在sqlserver2005中如何快速地分页?

我就是用楼主看不起的 row_number 和 order by 啊.

#2


没有看不起row_number ,而是看不起row_number 一定要加上order by 

#3


难道按存在数据库中的自然顺序就不能分页取数据吗? 
-----------------------------------------

你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??

#4


引用 3 楼 M1CR0S0FT 的回复:
难道按存在数据库中的自然顺序就不能分页取数据吗? 
----------------------------------------- 

你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??


同问

#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,这不是画蛇添足?

#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。

#9


如果大家还不清楚我的问题,http://topic.csdn.net/u/20080229/16/c4105263-4c8d-49cc-a77a-b22d9c6d53f9.html这里的楼主也碰到我同样问题,有空的可以看看。

#10


引用 7 楼 wuweihua 的回复:
难道按存在数据库中的自然顺序就不能分页取数据吗? 
----------------------------------------- 

你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么?? 
====================================== 
可能这位老兄对我的“自然顺序”有误会,我指的是存放在数据表的顺序,也就是不刻意加上order by某个字段查出来的顺序。 
难道我们每次查数据出来,都一定要加上order by?好像order by不是 select语法中的…

我理解你的意思,语法规定如此,我们没必要讨论它为什么这样,但结合实际应用,任何业务,查询出来的数据都肯定是有ORDER BY的,因为都会有排序的需求.

#11


我理解你的意思,语法规定如此,我们没必要讨论它为什么这样,但结合实际应用,任何业务,查询出来的数据都肯定是有ORDER BY的,因为都会有排序的需求.
==========================================
我知道sqlserver语法规定了这样,我们只有适应,但本来没必要加上这样限制,而且这个限制影响到我程序的灵活性,所以要抱怨几句。oracle,db2,mysql都没有加上这样的限制。

#1


在sqlserver2005中如何快速地分页?

我就是用楼主看不起的 row_number 和 order by 啊.

#2


没有看不起row_number ,而是看不起row_number 一定要加上order by 

#3


难道按存在数据库中的自然顺序就不能分页取数据吗? 
-----------------------------------------

你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??

#4


引用 3 楼 M1CR0S0FT 的回复:
难道按存在数据库中的自然顺序就不能分页取数据吗? 
----------------------------------------- 

你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么??


同问

#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,这不是画蛇添足?

#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。

#9


如果大家还不清楚我的问题,http://topic.csdn.net/u/20080229/16/c4105263-4c8d-49cc-a77a-b22d9c6d53f9.html这里的楼主也碰到我同样问题,有空的可以看看。

#10


引用 7 楼 wuweihua 的回复:
难道按存在数据库中的自然顺序就不能分页取数据吗? 
----------------------------------------- 

你工作过么?请问你如果取出来的是自然顺序,这样的数据取出来有意义么?? 
====================================== 
可能这位老兄对我的“自然顺序”有误会,我指的是存放在数据表的顺序,也就是不刻意加上order by某个字段查出来的顺序。 
难道我们每次查数据出来,都一定要加上order by?好像order by不是 select语法中的…

我理解你的意思,语法规定如此,我们没必要讨论它为什么这样,但结合实际应用,任何业务,查询出来的数据都肯定是有ORDER BY的,因为都会有排序的需求.

#11


我理解你的意思,语法规定如此,我们没必要讨论它为什么这样,但结合实际应用,任何业务,查询出来的数据都肯定是有ORDER BY的,因为都会有排序的需求.
==========================================
我知道sqlserver语法规定了这样,我们只有适应,但本来没必要加上这样限制,而且这个限制影响到我程序的灵活性,所以要抱怨几句。oracle,db2,mysql都没有加上这样的限制。