Paginare SQL Server 2005 Rezultate

voturi
36

Cum pagină I rezultate în SQL Server 2005?

Am încercat în SQL Server 2000, dar nu a existat nici o cale sigură de a face acest lucru. Mă întreb dacă acum SQL Server 2005 a construit în orice metodă?

Ceea ce vreau sa spun de paginare este, de exemplu, dacă am lista de utilizatori prin numele lor de utilizator, vreau să fie în măsură să se întoarcă numai primele 10 înregistrări, apoi următoarele 10 înregistrări și așa mai departe.

Orice ajutor ar fi mult mai apreciat.

Întrebat 05/08/2008 la 21:57
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
33

Puteți utiliza the Row_Number()funcția. Sa utilizat după cum urmează:

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

Din care aceasta va produce un set de rezultate cu un RowIDcâmp pe care le puteți utiliza la pagina între.

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

etc

Publicat 05/08/2008 la 21:59
sursa de către utilizator

voturi
13

Dacă încerci să-l într-o singură declarație (total plus paginare). Poate fi necesar să exploreze suport SQL Server pentru partiția de clauza (funcții windowing în termeni ANSI SQL). În Oracle sintaxa este la fel ca exemplul de mai sus, folosind ROW_NUMBER (), dar am adăugat, de asemenea, o partiție de clauză pentru a obține numărul total de rânduri incluse în fiecare rând a revenit în paginarea (rânduri totalul este 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

Rețineți că în cazul în care am proprietar = „CSEIS“ și partiția mea de e pe proprietar. Deci, rezultatele sunt:

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
Publicat 14/08/2008 la 18:15
sursa de către utilizator

voturi
5

Răspunsul acceptat pentru acest lucru nu funcționează de fapt, pentru mine ... A trebuit să sară printr-un cerc de mai multe pentru a face să funcționeze.

Când am încercat răspunsul

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

acesta nu a reușit, plângându-se că nu știa ce era RowId.

A trebuit să-l înveliți într-un interior selectați ca aceasta:

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

și apoi a lucrat.

Publicat 15/04/2009 la 18:56
sursa de către utilizator

voturi
2

Când trebuie să fac paginare, folosesc de obicei un tabel temporar, de asemenea. Puteți utiliza un parametru de ieșire pentru a reveni numărul total de înregistrări. În cazul in care declaratiile din select permit să sortați datele de pe coloane fără să fie nevoie să se recurgă la SQL dinamic.

--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
Publicat 16/09/2008 la 17:17
sursa de către utilizator

voturi
0

Iată ce fac eu pentru paginare: Toate interogările mari care trebuie să fie paginată sunt codificate ca inserții într-un tabel temp. Tabelul temp are un câmp de identitate, care va acționa într-un mod similar cu ROW_NUMBER () menționat mai sus. Am stoca numărul de rânduri în tabel temp într-un parametru de ieșire, astfel încât codul de apel știe cât de multe înregistrări există. Codul de asteptare, de asemenea, specifica pagina pe care dorește, și câte rânduri pe pagină, care sunt selectate afară din tabelul temp.

Lucru misto despre a face în acest fel este că am , de asemenea , o legătură „Export“ , care vă permite să obțineți toate rândurile din raportul returnat în format CSV de mai sus în fiecare grilă în cererea mea. Această legătură folosește aceeași procedură stocată: vă întoarceți doar conținutul tabelului temp în loc de a face logica de paginare. Acest placates utilizatorii care urăsc paginare, și doresc să vadă totul , și doresc să - l rezolve într - un milion de moduri diferite.

Publicat 13/08/2008 la 15:16
sursa de către utilizator

voturi
0

Cred că ai nevoie pentru a efectua o interogare separată pentru a realiza acest lucru unfortionately.

Am fost în stare să realizeze acest lucru la poziția mea anterioară folosind un ajutor de la această pagină: paginare în DotNet 2.0

Ei au, de asemenea, trăgând conta un rând separat.

Publicat 05/08/2008 la 22:05
sursa de către utilizator

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