Paging SQL Server 2005-Ergebnisse

Translate

Wie kann ich Ergebnisse in SQL Server 2005 seiten?

Ich habe es in SQL Server 2000 versucht, aber es gab keinen zuverlässigen Weg, dies zu tun. Ich frage mich jetzt, ob in SQL Server 2005 eine Methode integriert ist.

Mit Paging meine ich beispielsweise, wenn ich Benutzer nach ihrem Benutzernamen auflisten möchte, möchte ich nur die ersten 10 Datensätze, dann die nächsten 10 Datensätze usw. zurückgeben können.

Jede Hilfe wäre sehr dankbar.

This question and all comments follow the "Attribution Required."

Alle Antworten

Pat
Translate

Sie können verwendenthe Row_Number()Funktion. Es wird wie folgt verwendet:

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

Daraus ergibt sich eine Ergebnismenge mit aRowIDFeld, zwischen dem Sie blättern 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

usw

Quelle
Translate

Wenn Sie versuchen, es in einer Anweisung zu erhalten (die Summe plus das Paging). Möglicherweise müssen Sie die SQL Server-Unterstützung für die Partition by-Klausel untersuchen (Fensterfunktionen in ANSI SQL-Begriffen). In Oracle ist die Syntax genau wie im obigen Beispiel mit row_number (), aber ich habe auch eine partition by-Klausel hinzugefügt, um die Gesamtzahl der Zeilen zu ermitteln, die in jeder im Paging zurückgegebenen Zeile enthalten sind (insgesamt 1.262 Zeilen):

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 von auf owner ist. Die Ergebnisse sind also:

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

Die akzeptierte Antwort darauf funktioniert bei mir nicht wirklich ... Ich musste durch einen weiteren Reifen springen, damit es funktioniert.

Als ich die Antwort versuchte

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

es schlug fehl und beschwerte sich, dass es nicht wusste, was RowID war.

Ich musste es in eine innere Auswahl wie diese einwickeln:

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.

Quelle
Translate

Wenn ich Paging durchführen muss, verwende ich normalerweise auch eine temporäre Tabelle. Sie können einen Ausgabeparameter verwenden, um die Gesamtzahl der Datensätze zurückzugeben. Mit den case-Anweisungen in select können Sie die Daten nach bestimmten Spalten sortieren, ohne auf dynamisches SQL zurückgreifen 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 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
Quelle
Pat
Translate

Ich glaube, Sie müssten eine separate Abfrage durchführen, um dies unglücklicherweise zu erreichen.

Ich konnte dies an meiner vorherigen Position mithilfe der Hilfe dieser Seite erreichen:Paging in DotNet 2.0

Sie haben es auch, eine Reihe separat zu ziehen.

Quelle
Translate

Folgendes mache ich für das Paging: Alle meine großen Abfragen, die ausgelagert werden müssen, werden als Einfügungen in eine temporäre Tabelle codiert. Die temporäre Tabelle verfügt über ein Identitätsfeld, das sich ähnlich wie die oben erwähnte row_number () verhält. Ich speichere die Anzahl der Zeilen in der temporären Tabelle in einem Ausgabeparameter, damit der aufrufende Code weiß, wie viele Datensätze insgesamt vorhanden sind. Der aufrufende Code gibt auch an, welche Seite gewünscht wird und wie viele Zeilen pro Seite aus der temporären Tabelle ausgewählt werden.

Das Coole daran ist, dass ich auch einen "Export" -Link habe, über den Sie alle Zeilen aus dem Bericht als CSV über jedem Raster in meiner Anwendung zurückgeben können. Dieser Link verwendet dieselbe gespeicherte Prozedur: Sie geben nur den Inhalt der temporären Tabelle zurück, anstatt die Paging-Logik auszuführen. Dies beruhigt Benutzer, die Paging hassen und sehen wollenallesund wollen es auf millionenfache Weise sortieren.

Quelle