Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie mache ich Paging für jqGrid in einer gespeicherten Prozedur?

Es gibt viele Möglichkeiten, STORED PROCEDURE zu implementieren die du brauchst. Sie können beispielsweise ROW_NUMBER verwenden Konstruktion innerhalb der CTE-SQL-Anweisung.

Wenn Sie SQL Server 2012 verwenden, können Sie OFFSET verwenden und FETCH nach ORDER BY Paginierung zu implementieren (siehe hier ). ). In diesem Fall wird die SQL-Anweisung den entsprechenden MySQL- oder PostgreSQL-Anweisungen sehr ähnlich sein, die OFFSET verwenden und LIMIT . Übrigens verwendet Microsoft Entity Framework Entity SQL Language mit engem Konstrukt (SKIP und LIMIT ). Wahrscheinlich OFFSET und FETCH wäre der bevorzugte Weg, wenn Sie SQL Server 2012 oder höher verwenden.

Da Sie das SQL Server 2008-Tag in Ihre Frage aufgenommen haben, würde ich in meiner Antwort keine neuen SQL Server 2012-Konstrukte verwenden.

Eine weitere gute Möglichkeit wäre die Verwendung von sp_executesql wodurch Sie eine SQL-Anweisung als Zeichenfolge mit Parametern erstellen können. Es ermöglicht die Wiederverwendung von Ausführungsplänen, was für die beste Leistung sehr wichtig ist. Der Ansatz ermöglicht es Ihnen, den Code Ihrer STORED PROCEDURE zu erweitern um eine serverseitige Filterung (Suche) zu implementieren.

Ich sehe, dass die Paginierung in der SQL-Anweisung implementiert werden muss, die die ID der zurückgegebenen Daten enthält (PersonId in Ihrem Fall). Daher beschließe ich, Ihnen vorzuschlagen, die vereinfachte Methode zu verwenden, die SELECT TOP verwendet in Kombination mit LEFT OUTER JOIN .

Sie STORED PROCEDURE dbo.GetExtraPerson kann zwei zusätzliche Parameter vom Typ int haben :@skip und @pageSize . Bei @skip ist gleich 0 die STORED PROCEDURE kann einfach ausgeführt werden

SELECT TOP (@pageSize) PERS.PersonId
    ,PERS.FirstName
    ,PERS.LastName
    ,PERS.MobileNumber
    ,PERS.EmailId
    ,PERS.PersonNumber
    ,E.ExtraPersonId
    ,E.Diabetes
    ,E.BloodPressure
FROM ExtraPerson E  
    INNER JOIN Person PERS ON PERS.PersonId=E.PersonId  
WHERE [email protected] AND [email protected] AND E.IsDeleted=0

Wenn @skip ist ungleich 0 dann kann die entsprechende SQL-Anweisung die folgende sein

WITH GetAll AS (
    SELECT PERS.PersonId
        ,PERS.FirstName
        ,PERS.LastName
        ,PERS.MobileNumber
        ,PERS.EmailId
        ,PERS.PersonNumber
        ,E.ExtraPersonId
        ,E.Diabetes
        ,E.BloodPressure
    FROM ExtraPerson E  
        INNER JOIN Person PERS ON PERS.PersonId=E.PersonId  
    WHERE [email protected] AND [email protected] AND E.IsDeleted=0
),GetFirst AS (
    SELECT TOP (@skip) *
    FROM GetAll
    ORDER BY Name
),GetNext AS (
    SELECT TOP (@pageSize) a.*
    FROM GetAll AS a
        LEFT OUTER JOIN GetFirst AS f ON f.Id=a.Id
    WHERE f.Id IS NULL
    ORDER BY Name
)
SELECT * FROM GetNext 

Der vollständige Code von dbo.GetExtraPerson könnte etwa Folgendes sein

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE dbo.GetExtraPerson 
    @CampId int,
    @ReferencePatientId bigint,
    @skip int,
    @pageSize int
AS
BEGIN
    DECLARE @records int;
    SET NOCOUNT ON;

    SET @records = (SELECT COUNT(*)
                    FROM ExtraPerson E  
                        INNER JOIN Person PERS ON PERS.PersonId=E.PersonId  
                    WHERE [email protected]
                        AND [email protected]
                        AND E.IsDeleted=0);

    IF @skip <= 0
        SELECT TOP (@pageSize) PERS.PersonId
            ,PERS.FirstName
            ,PERS.LastName
            ,PERS.MobileNumber
            ,PERS.EmailId
            ,PERS.PersonNumber
            ,E.ExtraPersonId
            ,E.Diabetes
            ,E.BloodPressure
        FROM ExtraPerson E  
            INNER JOIN Person PERS ON PERS.PersonId=E.PersonId  
        WHERE [email protected] AND [email protected]
            AND E.IsDeleted=0
    ELSE
        WITH GetAll AS (
            SELECT PERS.PersonId
                ,PERS.FirstName
                ,PERS.LastName
                ,PERS.MobileNumber
                ,PERS.EmailId
                ,PERS.PersonNumber
                ,E.ExtraPersonId
                ,E.Diabetes
                ,E.BloodPressure
            FROM ExtraPerson E  
                INNER JOIN Person PERS ON PERS.PersonId=E.PersonId  
            WHERE [email protected] AND [email protected]
                AND E.IsDeleted=0
        ),GetFirst AS (
            SELECT TOP (@skip) *
            FROM GetAll
            ORDER BY Name
        ),GetNext AS (
            SELECT TOP (@pageSize) a.*
            FROM GetAll AS a
                LEFT OUTER JOIN GetFirst AS f ON f.Id=a.Id
            WHERE f.Id IS NULL
            ORDER BY Name
        )
        SELECT * FROM GetNext;

    RETURN @records;
END
GO

Die obige Prozedur gibt zusätzlich die Gesamtzahl der Datensätze zurück und Sie können damit totalRecords zuweisen Wert.

Wenn Sie den obigen Code in Kombination mit sp_executesql verwenden würden Sie können den Code einfach so ändern, dass er ORDER BY enthält in allen SELECT TOP Anweisungen, sodass die zurückgegebenen Werte der vom Benutzer in jqGrid angeforderten Sortierreihenfolge entsprechen.