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

голоса
36

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

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

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

Любая помощь приветствуется.

Задан 05/08/2008 в 21:57
источник пользователем
На других языках...                            


6 ответов

голоса
33

Вы можете использовать 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

и т.д

Ответил 05/08/2008 в 21:59
источник пользователем

голоса
13

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

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

Обратите внимание, что у меня есть, где владелец = «CSEIS» и мой раздел на на владельце. Таким образом, результаты являются:

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
Ответил 14/08/2008 в 18:15
источник пользователем

голоса
5

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

Когда я попытался ответить

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

а затем он работал.

Ответил 15/04/2009 в 18:56
источник пользователем

голоса
2

Когда мне нужно сделать пейджинг, я обычно использую временную таблицу, а также. Вы можете использовать выходной параметр, чтобы вернуть общее количество записей. Высказывания в случае избранного позволяют сортировать данные по определенным столбцам без необходимости прибегать к динамическим 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 IGNORE  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
Ответил 16/09/2008 в 17:17
источник пользователем

голоса
0

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

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

Ответил 13/08/2008 в 15:16
источник пользователем

голоса
0

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

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

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

Ответил 05/08/2008 в 22:05
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more