Stronicowania SQL Server 2005 wyników

głosy
36

Jak zrobić stronę Wyniki I w SQL Server 2005?

Próbowałem go w SQL Server 2000, ale nie było niezawodny sposób, aby to zrobić. Jestem teraz zastanawiasz się, czy SQL Server 2005 został zbudowany w jakikolwiek sposób?

Co mam na myśli stronicowania jest, na przykład, gdybym listy użytkowników poprzez jego nazwę, chcę być w stanie zwrócić tylko pierwsze 10 rekordów, a następnie kolejne 10 rekordów i tak dalej.

Każda pomoc będzie mile widziane.

Utwórz 05/08/2008 o 21:57
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
33

Można użyć the Row_Number()funkcji. Jest stosowany w następujący sposób:

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

Z którego będzie on uzyskując wynik zestaw z RowIDpola, które można wykorzystać do strony pomiędzy.

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

itp

Odpowiedział 05/08/2008 o 21:59
źródło użytkownik

głosy
13

Jeśli starasz się dostać je w jednej instrukcji (łączna plus stronicowania). Być może trzeba zbadać wsparcie dla SQL Server partycji przez klauzuli (funkcje okienkowe pod względem ANSI SQL). Oracle składni jak w przykładzie powyżej stosując row_number (), ale także przyczyniają się do partycji przez rozdział uzyskać całkowitą liczbę rzędów są w każdym rzędzie zwróconej w stronicowania (całkowita rzędów 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

Zauważ, że nie mam gdzie właściciel = „CSEIS” i moja partycja jest przez właściciela. Więc wyniki są następujące:

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
Odpowiedział 14/08/2008 o 18:15
źródło użytkownik

głosy
5

Zaakceptowanych odpowiedź na to faktycznie nie działa dla mnie ... musiałem skakać przez obręcz jednego więcej, aby uzyskać go do pracy.

Kiedy próbowałem odpowiedź

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

nie udało się, twierdząc, że nie wiedział, co było RowID.

Musiałem owinąć go w wewnętrzną wybrać tak:

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

a następnie pracował.

Odpowiedział 15/04/2009 o 18:56
źródło użytkownik

głosy
2

Kiedy muszę zrobić stronicowania, ja zazwyczaj korzystają z tabeli tymczasowej, jak również. Można użyć parametr wyjściowy do zwrotu całkowitej liczby rekordów. Przypadku stwierdzenia w select pozwala uporządkować dane dotyczące konkretnych kolumn, bez konieczności uciekania się do dynamicznego 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
Odpowiedział 16/09/2008 o 17:17
źródło użytkownik

głosy
0

Oto, co mogę zrobić dla stronicowania: Wszystkie moje wielkie pytania, które muszą być wywoływana są kodowane jako wkładki do tabeli temp. Tabela Temp ma pole tożsamości, które działają w podobny sposób jak w ROW_NUMBER () wymienionych powyżej. Przechowywać liczbę wierszy w tabeli temp w parametrze wyjściowym więc kod wywołujący wie ile łączne zapisy istnieją. Kod wywołujący określa również, które strona chce, i jak wiele wierszy na stronie, które zostały wybrane na zewnątrz z tabeli temp.

Świetną rzeczą robią to w ten sposób jest to, że również mają „Export” link, który pozwala uzyskać wszystkie wiersze z raportu zwracane jako CSV ponad wszelkie siatki w mojej aplikacji. Ten link wykorzystuje tę samą procedurę przechowywaną: wystarczy zwrócić zawartość tabeli temp zamiast robić logiki stronicowania. Ten placates użytkowników, którzy nienawidzą stronicowania, a chcą zobaczyć wszystko , a chcesz rozwiązać to na milion różnych sposobów.

Odpowiedział 13/08/2008 o 15:16
źródło użytkownik

głosy
0

Uważam, że trzeba wykonać oddzielne kwerendy do osiągnięcia, że ​​unfortionately.

Udało mi się to osiągnąć w moim poprzednim stanowisku stosując jakąś pomoc z tej strony: Pager w DotNet 2.0

Mają też to pociągnięcie liczyć wiersz oddzielnie.

Odpowiedział 05/08/2008 o 22:05
źródło użytkownik

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