Vă mulțumim pentru susținere

Rezolvarea paginilor SQL Server 2005

Cum pot afișa rezultatele în SQL Server 2005?

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

Ceea ce vreau să spun prin paginare este, de exemplu, dacă lista utilizatorilor prin numele de utilizator, vreau să pot reveni doar la primele 10 înregistrări, apoi la următoarele 10 înregistrări și așa mai departe.

Orice ajutor ar fi foarte apreciat.

0
adăugat editat

6 răspunsuri

Puteți utiliza funcția Row_Number () . Se folosește după cum urmează:

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

Din care va rezulta un set de rezultate cu un câmp RowID pe care îl puteți utiliza pentru a afișa între ele.

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

etc

0
adăugat
Acest raspuns nu functioneaza pentru mine, desi ma apropiat de mine. Se plânge că nu știe ce este RowID. Vedeți răspunsul meu de mai jos pentru informații suplimentare, dacă aveți aceeași problemă.
adăugat autor Beska
Excelent, simplu exemplu Pat - exact ceea ce am fost după :)
adăugat autor Town
În interiorul selectați, puteți selecta rândurile TOP X (X = rândul dorit, în acest caz - 10). Aceasta va îmbunătăți viteza interogării.
adăugat autor Faruz
Ca comentatorul de mai sus am menționat, îmbunătățiți performanța acestui cod prin adăugarea TOP la tabela interioară: SELECT TOP 10 Row_Number () OVER ... rânduri care vor fi necesare, în locul întregii mese.
adăugat autor Doug S

Cred că va trebui să efectuați o interogare separată pentru a realiza acest lucru în mod neobișnuit.

I was able to accomplish this at my previous position using some help from this page: Paging in DotNet 2.0

Ei au, de asemenea, trage un rând rând separat.

0
adăugat

Iată ce fac pentru paginare: toate interogările mele mari care trebuie să fie pagerate sunt codificate ca inserții într-o tabelă temp. Tabelul temporal are un câmp de identitate care va acționa în mod similar cu numărul de rând () menționat mai sus. Am stocat numărul de rânduri în tabelul temp într-un parametru de ieșire, astfel încât codul de apel să știe câte înregistrări totale există. Codul de apelare specifică, de asemenea, ce pagină dorește și câte rânduri pe pagină sunt selectate din tabelul temp.

Lucrul interesant de a face acest lucru este că am și un link "Export" care vă permite să obțineți toate rândurile din raport returnate ca CSV deasupra fiecărei grile din aplicația mea. Această legătură utilizează aceeași procedură memorată: pur și simplu returnați conținutul tabelului temp în loc să faceți logica de paginare. Acest lucru îi plac pe utilizatorii care nu-i plac la paging și doresc să vadă totul și doresc să-l sorteze într-un milion de moduri diferite.

0
adăugat

Răspunsul acceptat pentru acest lucru nu funcționează de fapt pentru mine ... a trebuit să trec printr-o altă buclă pentru a ajunge la lucru.

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

nu a reușit, plângându-se că nu știa ce a fost RowID.

A trebuit să o înfășez într-un interior selectat astfel:

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 funcționat.

0
adăugat

Dacă încercați să obțineți într-o singură declarație (total plus paginarea). Este posibil să trebuiască să explorați suportul SQL Server pentru partiția de clauză (funcții de ferestre în termeni ANSI SQL). În Oracle, sintaxa este la fel ca exemplul de mai sus folosind row_number (), dar am adăugat și o partiție de clauză pentru a obține numărul total de rânduri incluse cu fiecare rând returnat în paging (rândurile totale sunt 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

Rețineți că am unde proprietarul = 'CSEIS' și partiția mea este deținută. Astfel, 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
0
adăugat
+1 Mă întrebam cum pot obține rândurile totale și pagina fără a utiliza o tabelă temp. Mulțumiri!!
adăugat autor dotjoe
+1 ... frumos. Acum să vă jucați cu ea :-) Sunteți conștient de orice lovitură de performanță folosind COUNT (*) OVER (...)?
adăugat autor Chris J
+1 frumos - am lucrat la sqlserver folosind COUNT (*) OVER (PARTIDE BY NULL)
adăugat autor Hafthor
În general, orice puteți face în SQL direct va fi cea mai bună opțiune. Cu alte cuvinte, orice puteți face într-o singură interogare SQL va depăși probabil o abordare mai programată dacă este Java / pl / SQL C #. Citiți domnul Kyte cât de des posibil: tkyte.blogspot.com/2006 /10/slow-by-slow.html
adăugat autor Brian

Când trebuie să fac paginări, de obicei folosesc și o masă temporară. Puteți utiliza un parametru de ieșire pentru a returna numărul total de înregistrări. Declarațiile de caz din selectare vă permit să sortați datele pe coloane specifice, fără a fi nevoie să recurgeți 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 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
0
adăugat
Aceasta este ceea ce ați face în Sql Server 2000, dar versiunea din 2005 are o soluție mai bună utilizând funcția ROW_NUMBER.
adăugat autor niaher