Der er mange måder at implementere STORED PROCEDURE
på som du har brug for. For eksempel kan du bruge ROW_NUMBER
konstruktion inde i CTE SQL-sætning.
Hvis du bruger SQL Server 2012, kan du bruge OFFSET
og FETCH
efter ORDER BY
for at implementere paginering (se her
). I det tilfælde vil SQL-sætningen se meget tæt på de tilsvarende MySQL- eller PostgreSQL-sætninger, som bruger OFFSET
og LIMIT
. Microsoft Entity Framework bruger i øvrigt Entity SQL Language
med tæt konstruktion (SKIP
og LIMIT
). Sandsynligvis OFFSET
og FETCH
ville være den foretrukne måde, hvis du bruger SQL Server 2012 eller højere.
Fordi du inkluderede SQL Server 2008-tag i dit spørgsmål, ville jeg ikke bruge nye SQL Server 2012-konstruktioner i mit svar.
En anden god måde ville være at bruge sp_executesql
som giver dig mulighed for at konstruere en SQL-sætning som streng med parametre. Det giver mulighed for at genbruge eksekveringsplaner, hvilket er meget vigtigt for den bedste ydeevne. Fremgangsmåden giver dig mulighed for at udvide koden for din STORED PROCEDURE
at implementere serversidefiltrering (søgning).
Jeg ser, at det er nødvendigt at implementere paginering i SQL-sætningen, som indeholder ID for de returnerede data (PersonId
i dit tilfælde). Så jeg beslutter mig for at foreslå dig at bruge en forenklet måde som bruger SELECT TOP
i kombination med LEFT OUTER JOIN
.
Du STORED PROCEDURE
dbo.GetExtraPerson
kan have to yderligere parametre af typen int
:@skip
og @pageSize
. I tilfælde af @skip
er lig med 0
den STORED PROCEDURE
kan bare udføre
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
Hvis @skip
er ikke lig med 0
så kan den tilsvarende SQL-sætning være følgende
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
Den fulde kode for dbo.GetExtraPerson
kunne handle om følgende
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
Proceduren ovenfor returnerer det samlede antal poster yderligere, og du kan bruge den til at tildele totalRecords
værdi.
Hvis du vil bruge ovenstående kode i kombination med sp_executesql
du kan nemt ændre koden til at inkludere ORDER BY
i alt SELECT TOP
sætninger, så de returnerede værdier svarer til den sorteringsrækkefølge, brugeren anmoder om i jqGrid.