SQL Server 中的分页问题

问题描述 投票:0回答:5

我在SQL Server中搜索了分页。我发现大多数解决方案都是这样的

在 SQL Server 中对结果进行分页的最佳方法是什么

但是没有达到我的预期。

这是我的情况:

我在 JasperReport 上工作,为此:要导出报告,我只需将任何选择查询传递到模板中,它就会自动生成报告

EX:我有一个像这样的选择查询:

Select * from table A

我不知道表A中的任何列名。所以我无法使用

Select ROW_NUMBER() Over (Order By columsName)

而且我也不希望它按任何列排序。

有人可以帮我做吗?

PS:在 Oracle 中,rownum 在这种情况下非常有帮助。

Select * from tableA where rownum > 100 and rownum <200

使用 Oracle 进行分页

sql-server pagination sql-server-2005
5个回答
2
投票

应该

ROW_NUMBER
ORDER BY
一起使用 - 因为如果没有
ORDER BY
,则如何返回行就没有确定性。您可以运行相同的查询三次,并以三种不同的顺序返回结果。特别是当旋转木马扫描发挥作用时。

因此,除非您希望报告能够在多个页面上向用户显示相同的行,或者某些行从未在任何页面上显示,否则您需要找到一种方法来对结果集进行排序以使其具有确定性。


0
投票

我认为,你可以使用sql查询来找出表中有多少列,然后找到一个合适的“order by”依赖的列。 如何获取表的列的脚本参考:如何从 SQL Server 中的表中获取列名?


0
投票

查看此链接

http://msdn.microsoft.com/en-us/library/ms186734.aspx

SQL Server有类似的函数ROW_NUMBER。虽然它的行为有点不同。

SQL Server 不提供行顺序保证,除非您在 order by 子句中指定了列。我建议您提供具有唯一值的 order by 子句。


0
投票

感谢您的所有帮助。由于在 MS SQL Server 中分页时需要 order by,所以我使用 ResultSetMetaData 来获取列名称并进行分页。


0
投票

您也可以使用以下查询。

declare @test table(
id int,
value1 varchar(100),
value2 int)

insert into @test values(1,'10/50',50)
insert into @test values(2,'10/60',60)
insert into @test values(3,'10/60',61)
insert into @test values(4,'10/60',10)
insert into @test values(5,'10/60',11)
insert into @test values(6,'10/60',09)

select * 
from ( select row_number() over (order by (select 0)) as rownumber,* from @test )test 
where test.rownumber<=5
© www.soinside.com 2019 - 2024. All rights reserved.