Сортировка постраничных данных SQL
Вопрос
Мне нужно отобразить сетку на веб-странице.Данные будут поступать из 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
объявить @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
Решение
Из моей таблицы УПОРЯДОЧИВАЕТСЯ ПО РЕГИСТРУ, КОГДА @ColSort = 'ABC', ЗАТЕМ ABC ....
Более подробное объяснение
Другие советы
Динамический SQL, вероятно, ваш лучший выбор;поменяйте местами параметры сортировки в вашей функции row_number().Вы также можете параметризовать параметры в executesql, см. 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
Я полностью согласен с другими сообщениями, динамический SQL или оператор CASE order by - это варианты, позволяющие сделать это так, как вы описали.
Однако, в качестве отступления, посмотрите на остальную часть фреймворка, который вы используете.Если это asp.net 3.5, то его встроенные сетки и linq сделают все это за вас с минимальными усилиями.Попробуйте посмотреть на http://www.asp.net/learn.