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.