Что такое хороший способ разбить на страницы из SQL 2000, используя параметры Start и Length? - PullRequest
2 голосов
/ 15 января 2009

Мне было дано задание рефакторинга существующей хранимой процедуры, чтобы результаты были разбиты на страницы. Сервер SQL - это SQL 2000, поэтому я не могу использовать метод разбивки на страницы ROW_NUMBER. Хранимый процесс уже довольно сложен, он объединяет фрагменты большого оператора SQL перед выполнением процедуры sp_executesql и имеет различные доступные варианты сортировки.

Первый результат из Google кажется хорошим методом, но я думаю, что пример неправильный в том, что 2-й сорт должен быть перевернут, а случай, когда начало меньше длины страницы, не работает. Второй пример на этой странице также кажется хорошим методом, но SP использует номер страницы, а не начальную запись. И вся эта временная таблица выглядит так, как будто это приводит к снижению производительности.

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

Есть ли какие-то более простые техники, которые мне не хватает?

Ответы [ 6 ]

1 голос
/ 20 января 2009

В этом вопросе StackOverflow есть два ответа на SQL Server 2000-совместимый - пропустите принятый ответ, который предназначен только для 2005 года:

0 голосов
/ 19 января 2009

Мы использовали варианты этого запроса в течение ряда лет. Этот пример дает предметы от 50 000 до 50 300.

select top 300 
  Items.*
from Items
where 
  Items.CustomerId = 1234 AND
  Items.Active = 1 AND
  Items.Id not in
  ( 
    select top 50000 Items.Id
    from Items
    where 
      Items.CustomerId = 1234 AND
      Items.Active = 1
    order by Items.id
  )
order by Items.Id
0 голосов
/ 15 января 2009

После некоторой игры с этим, кажется, есть только один способ сделать это (используя параметры Start и Length), и это с временной таблицей.

Мое окончательное решение состояло в том, чтобы не использовать параметр @start и вместо этого использовать параметр @page, а затем использовать

    SET @sql = @sql + N'

    SELECT * FROM
    (
    SELECT TOP ' + Cast( @length as varchar) + N' * FROM 
            (
            SELECT TOP ' + Cast( @page*@length as varchar) + N'
                 field1,
                 field2 
                 From Table1
                 order by field1 ASC
            )  as Result   
            Order by Field1 DESC
     )  as Result
     Order by Field 1 ASC'

Исходный запрос был гораздо более сложным, чем показанный здесь, и порядок был упорядочен по крайней мере в 3 полях и определен длинным предложением CASE, что потребовало от меня использовать ряд функций REPLACE, чтобы получить правильные поля заказ.

0 голосов
/ 15 января 2009

В зависимости от архитектуры вашего приложения (и объема ваших данных, его структуры, нагрузки на сервер БД и т. Д.) Вы можете использовать уровень доступа к БД для подкачки.

Например, с помощью ADO вы можете определить размер страницы для объекта набора записей (DataSet в ADO.NET) и выполнить пейджинг на клиенте. Классический ADO даже позволяет вам использовать серверный курсор, хотя я не знаю, хорошо ли он масштабируется (я думаю, что он был полностью удален в ADO.NET).

Документация MSDN: Разбиение на страницы результатов запроса (ADO.NET)

0 голосов
/ 15 января 2009

Также посмотрите здесь http://databases.aspfaq.com/database/how-do-i-page-through-a-recordset.html

прокрутите вниз до Методы хранимой процедуры

0 голосов
/ 15 января 2009

Нет, я боюсь, что нет - SQL Server 2000 не имеет каких-либо тонкостей 2005 года, таких как Common Table Expression (CTE) и тому подобное ... метод, описанный в ссылке Google, кажется, один из способов идти.

Марк

...