我需要在网页上显示网格。数据将通过存储过程来自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
答案 0 :(得分:2)
FROM MyTable ORDER BY CASE当@ColSort ='ABC'那么ABC ....
更详尽的解释
答案 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。