Wyniki Paging SQL Server 2005

Jak wyświetlić wyniki w SQL Server 2005?

Próbowałem w SQL Server 2000, ale nie było wiarygodnego sposobu, aby to zrobić. Zastanawiam się teraz, czy SQL Server 2005 ma jakąś wbudowaną metodę?

Co mam na myśli przez stronicowanie jest, na przykład, jeśli Lista użytkowników według ich nazwy użytkownika, chcę być w stanie zwrócić tylko pierwsze 10 rekordów, a następnie następne 10 rekordów i tak dalej.

Każda pomoc będzie bardzo mile widziana.

Author: mattytommo, 2008-08-06

6 answers

Możesz użyć funkcji the Row_Number(). Stosuje się go w następujący sposób:

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

, z którego uzyskamy zbiór wyników z polem RowID, którego można użyć do wyświetlenia 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

Etc

 33
Author: Pat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-15 19:03:06

Jeśli próbujesz uzyskać to w jednym oświadczeniu(suma plus stronicowanie). Może być konieczne zbadanie obsługi SQL Server dla klauzuli partition by(funkcje okien w języku ANSI SQL). W Oracle składnia jest taka sama jak w powyższym przykładzie, używając row_number (), ale dodałem również klauzulę partition by, aby uzyskać całkowitą liczbę wierszy dołączonych do każdego wiersza zwracaną w stronicowaniu (całkowita liczba wierszy wynosi 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 mam where owner = 'CSEIS' i moja partycja by jest włączona właściciel. Więc wyniki są:

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
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 17:01:24

Zaakceptowana odpowiedź na to nie działa...Musiałem przeskoczyć przez jeszcze jedną obręcz, żeby to zadziałało.

Kiedy próbowałem odpowiedzieć

SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
WHERE RowID Between 0 AND 9
Nie powiodło się, narzekając, że nie wie, czym jest RowID.

Musiałem owinąć go w wewnętrzne select TAK:

SELECT * 
FROM
    (SELECT
    Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
    FROM Users
    ) innerSelect
WHERE RowID Between 0 AND 9
I wtedy zadziałało.
 5
Author: Beska,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-15 17:56:08

Kiedy muszę zrobić stronicowanie, zazwyczaj używam tymczasowej tabeli, jak również. Możesz użyć parametru output, aby zwrócić całkowitą liczbę rekordów. Polecenia case w select pozwalają sortować dane w określonych kolumnach bez potrzeby 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 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
Author: Andrew Burgess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 16:17:24

Uważam, że musisz wykonać osobne zapytanie, aby to osiągnąć.

Udało mi się to osiągnąć na moim poprzednim stanowisku, korzystając z pomocy z tej strony: stronicowanie w DotNet 2.0

Mają również ciągnięcie liczby rzędów oddzielnie.

 0
Author: Pat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-05 21:05:10

Oto co robię dla stronicowania: wszystkie moje duże zapytania, które muszą być paged są kodowane jako wstawki do tabeli temp. Tabela temp ma pole identity, które będzie działać w podobny sposób jak wspomniana powyżej metoda row_number (). Zapisuję liczbę wierszy w tabeli temp w parametrze wyjściowym, aby kod wywołujący wiedział, ile jest wszystkich rekordów. Kod wywołujący określa również, którą stronę chce i ile wierszy na stronę, które są wybrane z temp stolik.

Fajną rzeczą w robieniu tego w ten sposób jest to, że mam również link "eksport", który pozwala uzyskać wszystkie wiersze z raportu zwrócone jako CSV nad każdą siatką w mojej aplikacji. Ten link używa tej samej procedury składowanej: po prostu zwracasz zawartość tabeli tymczasowej zamiast wykonywać logikę stronicowania. To uspokaja użytkowników, którzy nienawidzą stronicowania i chcą zobaczyć Wszystko i chcą sortować to na milion różnych sposobów.

 0
Author: Eric Z Beard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-13 14:16:13