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 example@sqldat.com AND example@sqldat.com 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 example@sqldat.com AND example@sqldat.com 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 example@sqldat.com
                        AND example@sqldat.com
                        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 example@sqldat.com AND example@sqldat.com
            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 example@sqldat.com AND example@sqldat.com
                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.