2008-08-05 2 views
36

Как я могу найти результаты в SQL Server 2005?Результаты подкачки SQL Server 2005

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

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

Любая помощь будет высоко оценена.

ответ

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 

и т.д.

+0

Превосходный, простой пример Пэт - именно то, что я был после :) – Town 2009-09-18 09:59:53

+0

Этот ответ не работает для меня, хотя он и приблизил меня. Он жалуется, что не знает, что такое RowID. См. Мой ответ ниже для получения дополнительной информации, если у вас есть та же проблема. – Beska 2009-09-25 19:02:26

+2

Во внутреннем выборе вы можете выбрать TOP X rows (X = max row wanted, в данном случае - 10). Это улучшит скорость запроса. – Faruz 2010-01-05 08:18:54

0

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

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

Они также имеют это потянув рассчитывать ряд отдельно.

0

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

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

13

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

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 
2

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

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