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.