2009-05-01 63 views
2

我需要在网页上显示网格。数据将通过存储过程从SQL Server 2008中获得。由于sproc返回了数千条记录,我决定去寻找一个可以正常工作的分页选项。在存储过程中,我做这样的事情:SQL分页排序

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

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

我将为SQL注入200个SQL! – 2009-05-01 09:23:35

0

我完全与其他职位,动态SQL,或由CASE语句顺序不一致如你所描述的这样做的选项。

然而,请看看你正在使用的框架的其余部分。如果它的asp.net 3.5,然后它的内置网格和LINQ将以很小的努力为你做所有这些。试试看http://www.asp.net/learn