Сведения о вопросе

Electro Full

16:03, 1st July, 2020

Теги

sql   sql-server-2005   paging    

Результаты Paging SQL Server 2005

Просмотров: 399   Ответов: 6

Как сделать страницу результатов в SQL Server 2005?

Я попробовал это сделать в SQL Server 2000, но надежного способа сделать это не было. Теперь мне интересно, есть ли у SQL Server 2005 встроенный метод?

Например, если я перечисляю пользователей по их имени пользователя, я хочу иметь возможность возвращать только первые 10 записей, затем следующие 10 записей и так далее.

Любая помощь была бы очень признательна.



  Сведения об ответе

pumpa

18:03, 1st July, 2020

Вы можете использовать функцию the Row_Number() . Его используют следующим образом:

SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users

Из которого он даст результирующий набор с полем RowID , который вы можете использовать для перехода между ними.

SELECT * 
FROM 
    ( SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
      FROM Users 
    ) As RowResults
WHERE RowID Between 5 AND 10

и т.д.


  Сведения об ответе

JUST___

18:03, 1st July, 2020

Если вы пытаетесь получить его в одном заявлении (общая сумма плюс подкачка). Возможно, вам потребуется изучить поддержку SQL сервера для предложения partition by (оконные функции в терминах ANSI SQL). В Oracle синтаксис точно такой же, как в примере выше с использованием row_number(), но я также добавил предложение partition by, чтобы получить общее количество строк, включенных в каждую строку, возвращаемую в подкачке (всего строк 1262):

SELECT rn, total_rows, x.OWNER, x.object_name, x.object_type
FROM (SELECT COUNT (*) OVER (PARTITION BY owner) AS TOTAL_ROWS,
         ROW_NUMBER () OVER (ORDER BY 1) AS rn, uo.*
         FROM all_objects uo
         WHERE owner = 'CSEIS') x
WHERE rn BETWEEN 6 AND 10

Обратите внимание, что у меня есть where owner = 'CSEIS' и мой раздел by находится на владельце. Итак, результаты таковы:

RN  TOTAL_ROWS  OWNER   OBJECT_NAME            OBJECT_TYPE
6   1262    CSEIS   CG$BDS_MODIFICATION_TYPES   TRIGGER
7   1262    CSEIS   CG$AUS_MODIFICATION_TYPES   TRIGGER
8   1262    CSEIS   CG$BDR_MODIFICATION_TYPES   TRIGGER
9   1262    CSEIS   CG$ADS_MODIFICATION_TYPES   TRIGGER
10  1262    CSEIS   CG$BIS_LANGUAGES            TRIGGER


  Сведения об ответе

FAriza

18:03, 1st July, 2020

Принятый ответ на это на самом деле не работает для me...I пришлось прыгать через еще один обруч, чтобы заставить его работать.

Когда я попробовал ответить

SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
WHERE RowID Between 0 AND 9

он потерпел неудачу, жалуясь, что не знает, что такое RowID.

Я должен был завернуть его во внутренний выбор вот так:

SELECT * 
FROM
    (SELECT
    Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
    FROM Users
    ) innerSelect
WHERE RowID Between 0 AND 9

а потом это сработало.


  Сведения об ответе

PROGA

18:03, 1st July, 2020

Когда мне нужно сделать подкачку, я обычно использую временную таблицу. Можно использовать выходной параметр для возврата общего количества записей. Операторы case в select позволяют сортировать данные по определенным столбцам без необходимости использования метода dynamic SQL.

--Declaration--

--Variables
@StartIndex INT,
@PageSize INT,
@SortColumn VARCHAR(50),
@SortDirection CHAR(3),
@Results INT OUTPUT

--Statements--
SELECT @Results = COUNT(ID) FROM Customers
WHERE FirstName LIKE '%a%'

SET @StartIndex = @StartIndex - 1 --Either do this here or in code, but be consistent
CREATE TABLE #Page(ROW INT IDENTITY(1,1) NOT NULL, id INT, sorting_1 SQL_VARIANT, sorting_2 SQL_VARIANT)
INSERT INTO #Page(ID, sorting_1, sorting_2)
SELECT TOP (@StartIndex + @PageSize)
    ID,
    CASE
        WHEN @SortColumn='FirstName' AND @SortDirection='ASC' THEN CAST(FirstName AS SQL_VARIANT)
        WHEN @SortColumn='LastName' AND @SortDirection='ASC' THEN CAST(LastName AS SQL_VARIANT)
        ELSE NULL
    END AS sort_1,
    CASE
        WHEN @SortColumn='FirstName' AND @SortDirection='DES' THEN CAST(FirstName AS SQL_VARIANT)
        WHEN @SortColumn='LastName' AND @SortDirection='DES' THEN CAST(LastName AS SQL_VARIANT)
        ELSE NULL
    END AS sort_2
FROM (
    SELECT
        CustomerId AS ID,
        FirstName,
        LastName
    FROM Customers
    WHERE
        FirstName LIKE '%a%'
) C
ORDER BY sort_1 ASC, sort_2 DESC, ID ASC;

SELECT
    ID,
    Customers.FirstName,
    Customers.LastName
FROM #Page
INNER JOIN Customers ON
    ID = Customers.CustomerId
WHERE ROW > @StartIndex AND ROW <= (@StartIndex + @PageSize)
ORDER BY ROW ASC

DROP TABLE #Page


  Сведения об ответе

davran

18:03, 1st July, 2020

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

Я смог сделать это на своей предыдущей должности, используя некоторую помощь с этой страницы: Пейджинговая DotNet 2.0

У них также есть это вытягивание графа строк отдельно.


  Сведения об ответе

DO__IT

18:03, 1st July, 2020

Вот что я делаю для разбиения на страницы: все мои большие запросы, которые должны быть разбиты на страницы, кодируются как вставки во временную таблицу. Временная таблица имеет поле идентификатора, которое будет действовать аналогично row_number(), упомянутому выше. Я сохраняю количество строк во временной таблице в выходном параметре, чтобы вызывающий код знал, сколько всего записей существует. Вызывающий код также указывает, какая страница ему нужна, и сколько строк на странице, которые выбираются из временной таблицы.

Самое классное в этом способе заключается в том, что у меня также есть ссылка "Export", которая позволяет получить все строки из отчета, возвращенные как CSV над каждой сеткой в моем приложении. Эта ссылка использует ту же хранимую процедуру: вы просто возвращаете содержимое временной таблицы вместо выполнения логики подкачки. Это успокаивает пользователей, которые ненавидят пейджинг, хотят видеть все и хотят сортировать это миллионом различных способов.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться