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   
¿Fue útil?

Solución

DE MyTable ORDEN POR CASO CUANDO @ColSort = 'ABC' LUEGO ABC ....

Explicación más detallada

http://www.extremeexperts.com/sql/articles/CASEinORDER.aspx

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top