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