Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come eseguire il paging per jqGrid nella stored procedure?

Esistono molti modi per implementare STORED PROCEDURE di cui hai bisogno. Ad esempio puoi usare ROW_NUMBER costruzione all'interno dell'istruzione CTE SQL.

Se utilizzi SQL Server 2012 puoi utilizzare OFFSET e FETCH dopo ORDER BY per implementare l'impaginazione (vedi qui ). Nel caso in cui l'istruzione SQL sembrerà molto simile alle corrispondenti istruzioni MySQL o PostgreSQL che utilizzano OFFSET e LIMIT . A proposito, Microsoft Entity Framework usa Lingua Entity SQL con un costrutto chiuso (SKIP e LIMIT ). Probabilmente OFFSET e FETCH sarebbe il modo preferito se utilizzi SQL Server 2012 o versioni successive.

Poiché hai incluso il tag SQL Server 2008 nella tua domanda, non userei i nuovi costrutti di SQL Server 2012 nella mia risposta.

Un altro buon modo sarebbe usare sp_executesql che consente di costruire un'istruzione SQL come stringa con parametri. Consente di riutilizzare i piani di esecuzione che è molto importante per le migliori prestazioni. L'approccio ti consente di estendere il codice della tua STORED PROCEDURE per implementare il filtro lato server (ricerca).

Vedo che è necessario implementare l'impaginazione nell'istruzione SQL che contiene l'ID dei dati restituiti (PersonId nel tuo caso). Quindi decido di suggerirti di usare il modo semplificato che usa SELECT TOP in combinazione con LEFT OUTER JOIN .

STORED PROCEDURE dbo.GetExtraPerson può avere due parametri aggiuntivi di tipo int :@skip e @pageSize . In caso di @skip è uguale a 0 la STORED PROCEDURE può semplicemente eseguire

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

Se @skip non è uguale a 0 quindi l'istruzione SQL corrispondente può essere la seguente

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 

Il codice completo di dbo.GetExtraPerson potrebbe riguardare quanto segue

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 procedura precedente restituisce il numero totale di record in aggiunta e puoi usarlo per assegnare totalRecords valore.

Se dovessi utilizzare il codice sopra in combinazione con sp_executesql puoi facilmente modificare il codice per includere ORDER BY in tutto SELECT TOP istruzioni in modo che i valori restituiti corrispondano all'ordine di ordinamento richiesto dall'utente in jqGrid.