2009-05-01 78 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