Сортировка страниц по SQL - PullRequest
2 голосов
/ 01 мая 2009

Мне нужно отобразить сетку на веб-странице. Данные будут поступать из SQL Server 2008 через хранимую процедуру. Поскольку sproc возвращает тысячи записей, я решил использовать опцию подкачки, которая прекрасно работает. В хранимой процедуре я делаю что-то вроде этого:

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    

Это прекрасно работает, если пользователь с удовольствием получает данные, отсортированные по Col1. Как я могу переписать это, если я не знаю заранее, по какому столбцу должен быть отсортирован набор записей? Это не работает:

declare @RowIdMin int=10  
declare @RowIdMax int=25  

Declare @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   

Ответы [ 3 ]

2 голосов
/ 01 мая 2009

ОТ MyTable ЗАКАЗАТЬ ПО СЛУЧАЮ, КОГДА @ColSort = 'ABC', ТОГДА ABC ....

Более подробное объяснение

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

0 голосов
/ 01 мая 2009

Я полностью согласен с другими постами, динамическим SQL или порядком операторов CASE, так как вы можете сделать это, как вы описали.

Однако, в качестве отступления, посмотрите на остальную часть используемой вами платформы. Если его asp.net 3.5, то его встроенные сетки и linq сделают все это для вас без особых усилий. Попробуйте посмотреть на http://www.asp.net/learn.

0 голосов
/ 01 мая 2009

Динамический SQL - это, вероятно, ваша лучшая ставка; поменяйте местами параметры сортировки в вашей функции row_number (). Вы также можете параметризовать опции в executetesql, см. 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
...