Domanda
Devo visualizzare una griglia su una pagina web. I dati verranno da SQL Server 2008 tramite una procedura memorizzata. Dato che lo sproc restituisce migliaia di record, ho deciso di optare per un'opzione di paging che funziona bene. Nella procedura memorizzata, faccio qualcosa del genere:
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
Funziona bene fintanto che l'utente è felice di ottenere i dati ordinati per Col1. Come posso riscriverlo se non so in anticipo per quale colonna deve essere ordinato il recordset? Questo non funziona:
declare @RowIdMin int=10
declare @RowIdMax int=25
dichiara @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
Soluzione
DA MyTable ORDINA PER CASO QUANDO @ColSort = 'ABC' POI ABC ....
Spiegazione più approfondita
Altri suggerimenti
Dynamic SQL è probabilmente la soluzione migliore; scambia le opzioni di ordinamento nella tua funzione row_number (). Puoi parametrizzare le opzioni anche in executesql vedi 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
Sono totalmente d'accordo con gli altri post, SQL dinamico o un ordine CASE in base alle opzioni per fare ciò come hai descritto.
Tuttavia, a parte, guarda il resto del framework che stai utilizzando. Se è asp.net 3.5, allora le sue griglie e linq integrate faranno tutto questo per te con il minimo sforzo. Prova a guardare http://www.asp.net/learn .