2009-05-01 8 views
2

Ich muss ein Raster auf einer Webseite anzeigen. Die Daten stammen aus SQL Server 2008 über eine gespeicherte Prozedur. Da der Sproc Tausende von Datensätzen zurückgibt, entschied ich mich für eine Paging-Option, die gut funktioniert. In der gespeicherten Prozedur, kann ich so etwas wie diese:SQL-Paging-Sortierung

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  

Diese so lange funktioniert gut, wenn der Benutzer glücklich ist, die Daten von Col1 sortiert zu bekommen. Wie könnte ich das umschreiben, wenn ich nicht im Voraus weiß, in welche Spalte das Recordset sortiert werden soll? Dies funktioniert nicht:

declare @RowIdMin int=10 
declare @RowIdMax int=25 

declare @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 

Antwort

0

Dynamic SQL ist wahrscheinlich die beste Wahl. Tauschen Sie die Sortieroptionen in der Funktion row_number() aus. Sie können die Optionen in der ExecuteSQL zu 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

Ich nehme SQL Injection für 200 Alex! –

+0

Wer Eingaben nicht validiert, sollte sie verwenden, um Ausgaben zu erzeugen – u07ch

+0

+1 Injektion Angriff hat nichts mit der Frage zu tun – Andomar

0

sehen parametrieren Ich bin völlig einverstanden dies mit den anderen Beiträgen, dynamischen SQL oder einer CASE-Anweisung, um durch die Optionen zu tun, wie Sie beschrieben haben.

Wie auch immer, schauen Sie sich den Rest des von Ihnen verwendeten Frameworks an. Wenn sein asp.net 3.5 dann seine eingebauten Grids und Linq wird all dies für Sie mit sehr wenig Aufwand tun. Versuchen Sie, sich http://www.asp.net/learn anzusehen.