SQL paginação classificação
Pergunta
Eu preciso exibir uma grade em uma página web. Os dados virão do SQL Server 2008 através de um procedimento armazenado. Como o sproc retorna milhares de registros, eu decidi ir para uma opção de paginação que funciona bem. No procedimento armazenado, eu fazer algo parecido com isto:
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
Esta multa funciona, desde que o usuário tem o prazer de obter os dados classificado por Col1. Como eu poderia reescrever isso se eu não saber com antecedência qual coluna o conjunto de registos tem de ser classificado por? Isso não funciona:
declare @RowIdMin int=10
declare @RowIdMax int=25
VARCHAR declarar @ColSort (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
Solução
FROM MyTable ORDER BY CASE WHEN @ColSort = 'ABC', então ABC ....
Mais minuciosa explicação
Outras dicas
SQL dinâmico é provavelmente a sua melhor aposta; trocar as opções de classificação na sua função row_number (). Você pode parametrizar as opções na ExecuteSQL também 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
Eu concordo totalmente com os outros postos, SQL dinâmica, ou uma ordem de instrução CASE estão as opções para fazer isso, como você descreveu.
No entanto, como um aparte, olhar para o resto do quadro que você está usando. Se a sua asp.net 3,5, em seguida, sua construído em grades e LINQ vai fazer tudo isso para você com muito pouco esforço. Tente olhar para http://www.asp.net/learn .