Clasificación de paginación SQL
Pregunta
Necesito mostrar una cuadrícula en una página web. Los datos provendrán de SQL Server 2008 a través de un procedimiento almacenado. Como el sproc devuelve miles de registros, decidí optar por una opción de paginación que funciona bien. En el procedimiento almacenado, hago algo como esto:
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
Esto funciona bien siempre y cuando el usuario esté contento de ordenar los datos por Col1. ¿Cómo podría reescribir esto si no sé de antemano por qué columna se debe ordenar el conjunto de registros? Esto no funciona:
declare @RowIdMin int=10
declare @RowIdMax int=25
declarar @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
Solución
DE MyTable ORDEN POR CASO CUANDO @ColSort = 'ABC' LUEGO ABC ....
Explicación más detallada
Otros consejos
Dynamic SQL es probablemente su mejor apuesta; intercambia las opciones de ordenación en tu función row_number (). También puede parametrizar las opciones en el archivo de ejecución, ver 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
Estoy totalmente de acuerdo con las otras publicaciones, el SQL dinámico o el orden de una declaración de CASE por las opciones para hacer esto como lo describiste.
Sin embargo, como comentario aparte, mire el resto del marco que está utilizando. Si es asp.net 3.5, sus redes y linq incorporados harán todo esto por ti con muy poco esfuerzo. Intente mirar http://www.asp.net/learn .