我需要在网页上显示网格。数据将通过存储过程来自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   
有帮助吗?

解决方案

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

更详尽的解释

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

其他提示

动态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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top