SQL分页排序

时间:2009-05-01 09:16:25

标签: sql sorting paging

我需要在网页上显示网格。数据将通过存储过程来自SQL Server 2008。当sproc返回数千条记录时,我决定选择一种工作正常的分页选项。在存储过程中,我做了类似这样的事情:

declare @RowIdMin int=10  
declare @RowIdMax int=25  

select * 
from (select Col1, Col2, ROW_NUMBER() over (order by Col1 desc) as RowId  
      from MyTable ) dt  
where RowId BETWEEN @RowIdMin AND @RowIdMax    

只要用户乐于按Col1排序数据,这就可以正常工作。如果我事先不知道记录集必须按哪个列排序,我怎么能重写呢?这不起作用:

declare @RowIdMin int=10  
declare @RowIdMax int=25  

声明@ColSort varchar(100)='MyColumn'

select * 
from (select Col1, Col2, ROW_NUMBER() over (order by <b>@ColSort</b> desc) as RowId  
from MyTable) dt  
where RowId BETWEEN @RowIdMin AND @RowIdMax   

3 个答案:

答案 0 :(得分:2)

FROM MyTable ORDER BY CASE当@ColSort ='ABC'那么ABC ....

更详尽的解释

http://www.extremeexperts.com/sql/articles/CASEinORDER.aspx

答案 1 :(得分:0)

动态SQL可能是你最好的选择;换掉row_number()函数中的排序选项。您也可以在executionql中参数化选项,参见msdn

declare @SQLScript nVarchar(4000)

declare @RowIdMin int=10
declare @RowIdMax int=25
declare @ColSort varchar(100)='MyColumn'


Select @SQLScript = 'select * from (select Col1, Col2, ROW_NUMBER() over (order by ' + @ColSort + 'desc) as RowId from MyTable  dt where RowId BETWEEN ' + cast(@RowIdMin as nvarchar(100))+ ' AND ' + cast(@RowIdMax as nvarchar(100))

exec sp_executesql @SQLScript

答案 2 :(得分:0)

我完全同意其他帖子,动态SQL或CASE语句顺序是你所描述的选项。

但是,除此之外,请查看您正在使用的框架的其余部分。如果它的asp.net 3.5然后它的内置网格和linq将为您完成所有这些,只需很少的努力。试着看http://www.asp.net/learn