Hay muchas formas de implementar STORED PROCEDURE
que necesitas Por ejemplo, puede usar ROW_NUMBER
construcción dentro de la declaración CTE SQL.
Si usa SQL Server 2012, puede usar OFFSET
y FETCH
después de ORDER BY
para implementar la paginación (ver aquí
). En el caso, la instrucción SQL se parecerá mucho a las instrucciones MySQL o PostgreSQL correspondientes que usan OFFSET
y LIMIT
. Por cierto, Microsoft Entity Framework usa Entity SQL Language
tener una construcción cercana (SKIP
y LIMIT
). Probablemente OFFSET
y FETCH
sería la forma preferida si usa SQL Server 2012 o superior.
Debido a que incluyó la etiqueta de SQL Server 2008 en su pregunta, no usaría nuevas construcciones de SQL Server 2012 en mi respuesta.
Otra buena manera sería usar sp_executesql
que le permite construir una declaración SQL como una cadena con parámetros. Permite reutilizar planes de ejecución lo cual es muy importante para el mejor desempeño. El enfoque le permite extender el código de su STORED PROCEDURE
para implementar el filtrado del lado del servidor (búsqueda).
Veo que es necesario implementar la paginación en la instrucción SQL que contiene el ID de los datos devueltos (PersonId
en tu caso). Así que decido sugerirle que use una forma simplificada que use SELECT TOP
en combinación con LEFT OUTER JOIN
.
Usted STORED PROCEDURE
dbo.GetExtraPerson
puede tener dos parámetros adicionales de tipo int
:@skip
y @pageSize
. En caso de @skip
es igual a 0
el STORED PROCEDURE
solo puede ejecutar
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
Si @skip
no es igual a 0
entonces la instrucción SQL correspondiente puede ser la siguiente
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
El código completo de dbo.GetExtraPerson
podría tratarse de lo siguiente
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
El procedimiento anterior devuelve el número total de registros adicionalmente y puede usarlo para asignar totalRecords
valor.
Si usara el código anterior en combinación con sp_executesql
puede modificar fácilmente el código para incluir ORDER BY
en todos SELECT TOP
declaraciones para que los valores devueltos correspondan al orden de clasificación solicitado por el usuario en jqGrid.