Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment faire une pagination pour jqGrid dans une procédure stockée ?

Il existe de nombreuses façons d'implémenter STORED PROCEDURE dont vous avez besoin. Par exemple, vous pouvez utiliser ROW_NUMBER construction à l'intérieur de l'instruction SQL CTE.

Si vous utilisez SQL Server 2012, vous pouvez utiliser OFFSET et FETCH après ORDER BY pour implémenter la pagination (voir ici ). Dans le cas où l'instruction SQL sera très proche des instructions MySQL ou PostgreSQL correspondantes qui utilisent OFFSET et LIMIT . Au fait, Microsoft Entity Framework utilise Entity SQL Language ayant une construction proche (SKIP et LIMIT ). Probablement OFFSET et FETCH serait préférable si vous utilisez SQL Server 2012 ou supérieur.

Parce que vous avez inclus la balise SQL Server 2008 dans votre question, je n'utiliserais pas de nouvelles constructions SQL Server 2012 dans ma réponse.

Un autre bon moyen serait d'utiliser sp_executesql qui vous permet de construire une instruction SQL sous forme de chaîne avec des paramètres. Il permet de réutiliser les plans d'exécution ce qui est très important pour les meilleures performances. L'approche vous permet d'étendre le code de votre STORED PROCEDURE pour implémenter le filtrage côté serveur (recherche).

Je vois qu'il est nécessaire d'implémenter la pagination dans l'instruction SQL qui contient l'ID des données renvoyées (PersonId dans ton cas). Je décide donc de vous suggérer d'utiliser la méthode simplifiée qui utilise SELECT TOP en combinaison avec LEFT OUTER JOIN .

Vous STORED PROCEDURE dbo.GetExtraPerson peut avoir deux paramètres supplémentaires de type int :@skip et @pageSize . En cas de @skip est égal à 0 la STORED PROCEDURE peut simplement exécuter

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

Si @skip n'est pas égal à 0 alors l'instruction SQL correspondante peut être la suivante

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 

Le code complet de dbo.GetExtraPerson pourrait concerner ce qui suit

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

La procédure ci-dessus renvoie également le nombre total d'enregistrements et vous pouvez l'utiliser pour attribuer totalRecords valeur.

Si vous utilisez le code ci-dessus en combinaison avec sp_executesql vous pouvez facilement modifier le code pour inclure ORDER BY dans tous SELECT TOP afin que les valeurs renvoyées correspondent à l'ordre de tri demandé par l'utilisateur dans jqGrid.