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 [email protected] AND [email protected] 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 [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
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 [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 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.