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.