sql >> Database >  >> RDS >> Sqlserver

Hoe paging voor jqGrid doen in de opgeslagen procedure?

Er zijn veel manieren om STORED PROCEDURE te implementeren die je nodig hebt. U kunt bijvoorbeeld ROW_NUMBER . gebruiken constructie in de CTE SQL-instructie.

Als u SQL Server 2012 gebruikt, kunt u OFFSET . gebruiken en FETCH na ORDER BY om paginering te implementeren (zie hier ). In het geval dat de SQL-instructie erg dicht lijkt bij de corresponderende MySQL- of PostgreSQL-instructies die OFFSET gebruiken en LIMIT . Trouwens, Microsoft Entity Framework gebruikt Entity SQL Language close constructie hebben (SKIP en LIMIT ). Waarschijnlijk OFFSET en FETCH zou de voorkeur hebben als u SQL Server 2012 of hoger gebruikt.

Omdat u de SQL Server 2008-tag in uw vraag hebt opgenomen, zou ik geen nieuwe SQL Server 2012-constructies in mijn antwoord gebruiken.

Een andere goede manier zou zijn om sp_executesql . te gebruiken waarmee u een SQL-instructie kunt construeren als een tekenreeks met parameters. Het maakt het mogelijk om uitvoeringsplannen te hergebruiken, wat erg belangrijk is voor de beste prestaties. De aanpak stelt u in staat om de code van uw STORED PROCEDURE . uit te breiden om server-side filtering (zoeken) te implementeren.

Ik zie dat het nodig is om paginering te implementeren in de SQL-instructie die de ID van de geretourneerde gegevens bevat (PersonId in jouw geval). Dus ik besluit je aan te raden om een ​​vereenvoudigde manier te gebruiken die SELECT TOP . gebruikt in combinatie met LEFT OUTER JOIN .

Je STORED PROCEDURE dbo.GetExtraPerson kan twee extra parameters hebben van het type int :@skip en @pageSize . In het geval van @skip is gelijk aan 0 de STORED PROCEDURE kan gewoon uitvoeren

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

Als @skip is niet gelijk aan 0 dan kan de bijbehorende SQL-instructie de volgende zijn

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 

De volledige code van dbo.GetExtraPerson zou over het volgende kunnen gaan

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

De bovenstaande procedure retourneert bovendien het totale aantal records en u kunt het gebruiken om totalRecords toe te wijzen waarde.

Als je bovenstaande code zou gebruiken in combinatie met sp_executesql u kunt de code eenvoudig wijzigen om ORDER BY op te nemen in totaal SELECT TOP instructies zodat de geretourneerde waarden overeenkomen met de sorteervolgorde die door de gebruiker in jqGrid is gevraagd.




  1. Hoe installeer ik mysql vanuit een batchbestand?

  2. Importeer een groot CSV-bestand in MySQL

  3. Hoe ontsnap ik aan een enkele aanhalingsteken in SQL Server?

  4. Voorkomt deze code SQL-injectie?