我在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
答案 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