2

我需要在网页上显示一个网格。数据将通过存储过程来自 SQL Server 2008。由于存储过程返回了数千条记录,我决定选择一个工作正常的分页选项。在存储过程中,我执行以下操作:

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   
4

3 回答 3

2

当@ColSort = 'ABC' THEN ABC ....

更详尽的解释

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

于 2009-05-01T09:21:12.417 回答
0

动态 SQL 可能是您最好的选择;换掉 row_number() 函数中的排序选项。您也可以参数化 executesql 中的选项,请参阅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
于 2009-05-01T09:21:25.880 回答
0

我完全同意其他帖子,动态 SQL 或 CASE 语句 order by 是您所描述的执行此操作的选项。

然而,顺便说一句,看看你正在使用的框架的其余部分。如果它的 asp.net 3.5 那么它内置的网格和 linq 将为您完成所有这些工作,并且非常轻松。尝试查看http://www.asp.net/learn

于 2009-05-01T09:23:43.860 回答