Paging SQL Server 2005 Ergebnisse

stimmen
36

Wie kann ich Seite Ergebnisse in SQL Server 2005?

Ich habe versucht, es in SQL Server 2000, aber es gab keine zuverlässige Möglichkeit, dies zu tun. Ich frage mich jetzt, wenn SQL Server 2005 hat jeder in Verfahren gebaut?

Was ich Paging bedeuten, zum Beispiel, wenn ich Benutzer auflisten, indem Sie ihren Benutzernamen, möchte ich in der Lage sein, nur die ersten 10 Datensätze zurück, dann die nächsten 10 Datensätze und so weiter.

Jede Hilfe wäre sehr geschätzt.

Veröffentlicht am 05/08/2008 um 21:57
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
33

Sie können mit the Row_Number()Funktion. Seine wie folgt verwendet:

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

Von dem es eine Ergebnismenge mit einem weichen RowIDFeld , das Sie auf Seite zwischen verwenden können.

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

etc

Beantwortet am 05/08/2008 um 21:59
quelle vom benutzer

stimmen
13

Wenn Sie versuchen, es in einer Erklärung (die Gesamt plus das Paging) zu erhalten. Möglicherweise müssen Sie SQL Server-Unterstützung für die Partition durch Klausel (Windowing-Funktionen in ANSI SQL Begriffe) erkunden. In Oracle die Syntax ist wie das obige Beispiel mit row_number (), aber ich habe auch eine Partition durch Klausel hinzugefügt, um die Gesamtzahl der Zeilen, wobei jede Zeile in dem Paging zurück enthalten zu erhalten (Gesamt Reihen 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

Beachten Sie, dass ich habe, wo owner = ‚CSEIS‘ und meine Partition auf Besitzer. So sind die Ergebnisse:

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
Beantwortet am 14/08/2008 um 18:15
quelle vom benutzer

stimmen
5

Die akzeptierte Antwort auf diese nicht wirklich für mich zu arbeiten ... Ich hatte durch einen weiteren Reifen zu springen, um es Arbeit zu lernen.

Als ich versuchte, die Antwort

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

es scheiterte, beschwert, dass sie nicht wussten, was RowID war.

Ich hatte es in einem inneren wie diese wählen zu wickeln:

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

und dann hat es funktioniert.

Beantwortet am 15/04/2009 um 18:56
quelle vom benutzer

stimmen
2

Wenn ich Paging tun müssen, ich verwende in der Regel eine temporäre Tabelle als auch. Sie können einen Ausgabeparameter verwenden, um die Gesamtzahl der Datensätze zurück. Die Case-Anweisungen in der Auswahl können Sie die Daten auf bestimmte Spalten sortieren, ohne dynamische SQL greifen zu müssen.

--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
Beantwortet am 16/09/2008 um 17:17
quelle vom benutzer

stimmen
0

Hier ist, was ich für das Paging zu tun: Alle meine große Abfragen, die zu ausgelagerten müssen, werden als Einlagen in eine temporäre Tabelle codiert. Die temporäre Tabelle hat ein Identitätsfeld, das in ähnlicher Weise wie in dem row_number () wie oben erwähnt wirken. Ich speichere die Anzahl der Zeilen in der temporären Tabelle in einem Ausgabeparameter so der anruf Code weiß, wie viele Einträge gesamt geben. Der Aufrufcode gibt auch an, welche Seite es will, und wie viele Zeilen pro Seite, die aus der temporären Tabelle ist ausgewählt aus.

Die kühle Sache über es auf diese Weise tun , ist , dass ich auch ein „Export“ Link haben , die Sie erlaubt es, alle Zeilen zu erhalten aus dem Bericht als CSV über jedem Raster in meiner Anwendung zurückgegeben. Dieser Link verwendet die gleiche gespeicherte Prozedur: Sie gerade den Inhalt der temporären Tabelle zurückzukehren , anstatt die Paging - Logik zu tun. Diese besänftigt Benutzer , die Paging hassen, und wollen sehen , alles , und wollen es in eine Million verschiedene Arten sortieren.

Beantwortet am 13/08/2008 um 15:16
quelle vom benutzer

stimmen
0

Ich glaube, Sie bräuchten eine separate Abfrage durchzuführen, dass unfortionately zu erreichen.

Ich konnte dies in meiner früheren Position erreichen , die auf dieser Seite etwas Hilfe mit: Paging in DotNet 2.0

Sie haben es auch einzeln eine Reihe zählen zu ziehen.

Beantwortet am 05/08/2008 um 22:05
quelle vom benutzer

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