Пейджинг SQL Server 2005 Результаты

Как мне отобразить результаты в SQL Server 2005?

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

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

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

5.08.2008 20:57:00
6 ОТВЕТОВ
РЕШЕНИЕ

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

и т.д

35
15.04.2009 19:03:06
Отличный, простой пример Пэт - именно то, что я преследовал :)
Town 18.09.2009 09:59:53
Этот ответ не работает для меня, хотя он приблизил меня. Он жалуется, что не знает, что такое RowID. Смотрите мой ответ ниже для дополнительной информации, если у вас есть такая же проблема.
Beska 25.09.2009 19:02:26
Во внутреннем выделении вы можете выбрать TOP X строк (X = максимальное количество строк, в данном случае - 10). Это улучшит скорость запроса.
Faruz 5.01.2010 08:18:54
Как упомянул вышеупомянутый комментатор, улучшите производительность этого кода, добавив TOPво внутреннюю таблицу: SELECT TOP 10 Row_Number() OVER... вы будете извлекать только нужные строки, а не всю таблицу.
Doug S 25.07.2012 22:35:35

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

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

У них также есть это, тянущее число рядов отдельно.

0
5.08.2008 21:05:10

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

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

0
13.08.2008 14:16:13

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

Обратите внимание, что у меня есть, где owner = '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
13
22.02.2018 17:01:24
+1 Мне было интересно, как получить общее количество строк и страницы без использования временной таблицы. Спасибо!!
dotjoe 17.12.2008 15:04:49
+1 приятно - заставить его работать на sqlserver, используя COUNT (*) OVER (PARTITION BY NULL)
Hafthor 20.03.2009 19:27:05
+1 ... приятно. Теперь, чтобы поиграть с этим :-) Вы знаете о каком-либо падении производительности, используя COUNT (*) OVER (...)?
Chris J 30.11.2010 17:31:37
В общем, все, что вы можете сделать в SQL напрямую, будет лучшим вариантом. Другими словами, все, что вы можете сделать в «одном» SQL-запросе, вероятно, превзойдет более программный подход, будь то Java / pl / SQL C #. Читайте мистера Кайта как можно чаще: tkyte.blogspot.com/2006/10/slow-by-slow.html
Brian 1.12.2010 01:33:24

Когда мне нужно сделать пейджинг, я обычно тоже использую временную таблицу. Вы можете использовать выходной параметр, чтобы вернуть общее количество записей. Операторы case в select позволяют сортировать данные по определенным столбцам, не прибегая к динамическому 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
2
16.09.2008 16:17:24
Это то, что вы делаете в Sql Server 2000, но версия 2005 имеет лучшее решение, использующее функцию ROW_NUMBER.
niaher 29.06.2009 01:15:57

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

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

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

и тогда это сработало.

5
15.04.2009 17:56:08