STORED PROCEDURE
を実装する方法はたくさんあります あなたが必要とするもの。たとえば、ROW_NUMBER
を使用できます CTE SQL ステートメント内の構造。
SQL Server 2012 を使用している場合は、OFFSET
を使用できます そして FETCH
ORDER BY
の後 ページネーションを実装する (こちら
を参照) )。この場合、SQL ステートメントは、OFFSET
を使用する対応する MySQL または PostgreSQL ステートメントに非常に似ています。 と LIMIT
.ところで、Microsoft Entity Framework は Entity SQL Language
を使用します 近い構文を持つ (SKIP
と LIMIT
)。おそらく OFFSET
そして FETCH
SQL Server 2012 以降を使用する場合は、この方法をお勧めします。
質問に SQL Server 2008 タグが含まれているため、回答では新しい SQL Server 2012 構成要素を使用しません。
もう 1 つの良い方法は、sp_executesql
を使用することです。 これにより、SQL ステートメントをパラメーター付きの文字列として構築できます。最高のパフォーマンスを得るために非常に重要な実行計画を再利用できます。このアプローチにより、 STORED PROCEDURE
のコードを拡張できます サーバー側のフィルタリング (検索) を実装します。
返されたデータの ID (PersonId
) を含む SQL ステートメントにページネーションを実装する必要があることがわかりました。 あなたの場合)。そこで、SELECT TOP
を使用する簡単な方法を使用することをお勧めします。 LEFT OUTER JOIN
と組み合わせて .
STORED PROCEDURE
dbo.GetExtraPerson
タイプ int
の 2 つの追加パラメータを持つことができます :@skip
および @pageSize
. @skip
の場合 0
に等しい STORED PROCEDURE
実行できます
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
If @skip
0
と等しくありません 対応する SQL ステートメントは次のようになります
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
dbo.GetExtraPerson
の完全なコード 次のようなことが考えられます
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
上記の手順はさらにレコードの総数を返し、それを使用して totalRecords
を割り当てることができます
上記のコードを sp_executesql
と組み合わせて使用する場合 コードを簡単に変更して ORDER BY
を含めることができます すべての SELECT TOP
で 返される値が、jqGrid でユーザーが要求した並べ替え順序に対応するようにステートメントを作成します。