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   
Foi útil?

Solução

FROM MyTable ORDER BY CASE WHEN @ColSort = 'ABC', então ABC ....

Mais minuciosa explicação

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

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top