Paging SQL Server 2005 Resultater

stemmer
36

Hvordan kan jeg siden resultater i SQL Server 2005?

Jeg prøvde det i SQL Server 2000, men det var ingen pålitelig måte å gjøre dette. Jeg er nå lurer på om SQL Server 2005 har noen innebygd metode?

Hva jeg mener med paging er, for eksempel, hvis jeg liste brukerne av deres brukernavn, jeg ønsker å være i stand til å bare returnere de første 10 poster, så de neste 10 poster og så videre.

Eventuelle hjelpe ville være mye verdsatt.

Publisert på 05/08/2008 klokken 20:57
kilden bruker
På andre språk...                            


6 svar

stemmer
33

Du kan bruke the Row_Number()funksjonen. Dens brukes som følger:

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

Fra der det vil gi et resultat sett med en RowIDfelt som du kan bruke til side mellom.

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

etc

Svarte 05/08/2008 kl. 20:59
kilden bruker

stemmer
13

Hvis du prøver å få det i en uttalelse (totalt pluss paging). Du må kanskje utforske SQL Server-støtte for partisjonen klausul (vindusfunksjoner i ANSI SQL-termer). I Oracle syntaksen er akkurat som i eksempelet ovenfor, ved anvendelse av row_number (), men jeg har også lagt en skillevegg ved punkt for å få det totale antall rader inkludert i hver rad returneres i personsøker (totalt antall rader er 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

Legg merke til at jeg har der eieren = 'CSEIS' og min partisjonen er på eieren. Slik at resultatene er:

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
Svarte 14/08/2008 kl. 17:15
kilden bruker

stemmer
5

Den aksepterte svaret på dette faktisk ikke fungerer for meg ... Jeg måtte hoppe gjennom en mer bøyle for å få det til å fungere.

Da jeg prøvde svaret

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

det mislyktes, klaget over at det ikke visste hva ROWID var.

Jeg måtte pakke det inn i en indre velge som dette:

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

og deretter det fungerte.

Svarte 15/04/2009 kl. 17:56
kilden bruker

stemmer
2

Når jeg trenger å gjøre paging, jeg bruker vanligvis en midlertidig tabell også. Du kan bruke en utgang parameter for å returnere det totale antallet poster. Saken uttalelser i select kan du sortere data på bestemte kolonner uten å måtte ty til dynamisk 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
Svarte 16/09/2008 kl. 16:17
kilden bruker

stemmer
0

Her er hva jeg gjør for paging: Alle mine store spørsmål som må vekslet er kodet som innstikk i en temp tabellen. Temp tabellen har en identitet felt som vil virke på en lignende måte som den row_number () som er nevnt ovenfor. Jeg lagre nummeret rader i temp tabellen i en utgang parameter så ringer koden vet hvor mange det totale antall poster er det. Ringer koden angir også hvilken side den ønsker, og hvor mange rader per side, som velges ut fra temp tabellen.

Den kule ting om å gjøre det på denne måten er at jeg også har en "Export" link som lar deg få alle rader fra rapporten returnert som CSV ovenfor hver rutenett i søknaden min. Denne linken bruker samme lagret prosedyre: du bare returnere innholdet i temp tabellen i stedet for å gjøre søkingen logikk. Dette placates brukere som hater paging, og ønsker å se alt , og ønsker å sortere det i en million forskjellige måter.

Svarte 13/08/2008 kl. 14:16
kilden bruker

stemmer
0

Jeg tror du trenger å utføre en egen spørring for å oppnå det unfortionately.

Jeg var i stand til å gjøre dette på min forrige posisjon ved hjelp av litt hjelp fra denne siden: Øker i DotNet 2.0

De har også det å trekke en rad teller separat.

Svarte 05/08/2008 kl. 21:05
kilden bruker

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