在SQL Server中分页问题

时间:2012-10-08 02:27:23

标签: sql-server sql-server-2005 paging

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

What is the best way to paginate results in SQL Server

但它不符合我的期望。

以下是我的情况:

我在JasperReport上工作,为此:要导出报告,我只需要将任何Select查询传递给模板,它将自动生成报告

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

Paging with Oracle

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

查看此链接

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

SQL Server具有类似的功能ROW_NUMBER。虽然它的行为有点不同。

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

答案 2 :(得分:0)

从我的观点来看,你可以使用sql查询找出一个表中有多少列,然后找出一个适合'order by'依赖的列。 如何获取表格列的脚本参考:How can I get column names from a table in SQL Server?

答案 3 :(得分:0)

感谢您的帮助。在 MS SQL Server 中进行分页时,由于顺序是必需的,因此我使用ResultSetMetaData获取列名称并进行分页。

答案 4 :(得分: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