Domanda

Come faccio a pagina risultati in SQL Server 2005?

Ho provato in SQL Server 2000, ma non c'è alcun modo affidabile per fare questo.Ora sto chiedendo se SQL Server 2005 ha alcun costruito nel metodo?

Quello che voglio dire paging è, per esempio, se I elenco di utenti con nome, voglio essere in grado di restituire solo i primi 10 record, quindi il prossimo 10 record e così via.

Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

È possibile utilizzare the Row_Number() funzione.Utilizzato come segue:

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

Da cui il rendimento di un set con un RowID campo che è possibile utilizzare per pagina tra.

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

ecc

Altri suggerimenti

Se stai cercando di ottenere una dichiarazione (la più totale (paging).Potrebbe essere necessario esplorare il supporto di SQL Server per la partizione di clausola (funzioni delle finestre in ANSI SQL termini).In Oracle la sintassi è proprio come l'esempio di cui sopra utilizzando row_number(), ma ho anche aggiunto una partizione da clausola per ottenere il numero totale di righe incluso con ogni riga restituita nel paging (totale righe è a 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

Nota che io sono proprietario = 'CSEIS' e la mia partizione è proprietario.Quindi i risultati sono:

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

Accettato risposta per questo che in realtà non funziona per me...ho dovuto saltare attraverso una più hoop per farlo funzionare.

Quando ho cercato la risposta

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

non è riuscito, lamentandosi del fatto che non sapevo cosa RowID stato.

Ho dovuto inserirla in una select interna come questo:

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

e poi ha funzionato.

Quando ho bisogno di fare il paging, io in genere uso una tabella temporanea, come pure.È possibile utilizzare un parametro di output per restituire il numero totale di record.Il caso di dichiarazioni nel selezionare consentono di ordinare i dati in colonne specifiche, senza dover ricorrere a SQL dinamico.

--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

Credo che avresti bisogno di eseguire una query separata per realizzare che unfortionately.

Sono stato in grado di realizzare questo mio precedente posizione con qualche aiuto da questa pagina:La chiamata in DotNet 2.0

Essi hanno anche non tirando una riga conteggio separatamente.

Ecco cosa posso fare per il paging:Tutti i miei big query che devono essere di paging sono codificati come si inserisce in una tabella temporanea.La temp tabella ha un campo di identità, che agirà in un modo simile alla funzione row_number() di cui sopra.Memorizzare il numero di righe nella tabella temporanea in un parametro di output in modo che il codice chiamante conosce il numero totale di record ci sono.Il codice di chiamata specifica, inoltre, che la pagina che si vuole, e il numero di righe per pagina, selezionate dalla tabella temporanea.

Il bello di questo metodo è che ho anche un ' "Esportazione" di collegamento che consente di ottenere tutte le righe della relazione restituito come CSV al di sopra di ogni griglia nella mia applicazione.Questo link utilizza la stessa stored procedure:basta restituire il contenuto della tabella temp invece di fare il paging logica.Questo placa gli utenti che odiano paging, e si vuole vedere tutto, e desidera ordinare in un milione di modi diversi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top