Je souhaite renvoyer le nombre total d'enregistrements dans la base de données afin de pouvoir configurer la pagination. Comment renvoyer le nombre total d'enregistrements dans la base de données lors de l'utilisation de la méthode de pagination suivante dans SQL Server 2008?
ALTER PROCEDURE [dbo].[Nop_LoadAllOptimized]
(
@PageSize int = 20,
@PageNumber int = 1,
@WarehouseCombinationID int = 1,
@CategoryId int = 58,
@OrderBy int = 0,
@TotalRecords int = null OUTPUT
)
AS
BEGIN
WITH Paging AS (
SELECT rn = (ROW_NUMBER() OVER (
ORDER BY
CASE WHEN @OrderBy = 0 AND @CategoryID IS NOT NULL AND @CategoryID > 0
THEN pcm.DisplayOrder END ASC,
CASE WHEN @OrderBy = 0
THEN p.[Name] END ASC,
CASE WHEN @OrderBy = 5
THEN p.[Name] END ASC,
CASE WHEN @OrderBy = 10
THEN wpv.Price END ASC,
CASE WHEN @OrderBy = 15
THEN wpv.Price END DESC,
CASE WHEN @OrderBy = 20
THEN wpv.Price END DESC,
CASE WHEN @OrderBy = 25
THEN wpv.UnitPrice END ASC
)), p.*, pcm.DisplayOrder, wpv.Price, wpv.UnitPrice FROM Nop_Product p
INNER JOIN Nop_Product_Category_Mapping pcm ON p.ProductID=pcm.ProductID
INNER JOIN Nop_ProductVariant pv ON p.ProductID = pv.ProductID
INNER JOIN Nop_ProductVariant_Warehouse_Mapping wpv ON pv.ProductVariantID = wpv.ProductVariantID
WHERE pcm.CategoryID = @CategoryId AND (wpv.Published = 1 AND pv.Published = 1 AND p.Published = 1 AND p.Deleted = 0)
AND wpv.WarehouseID IN (select WarehouseID from Nop_WarehouseCombination where UserWarehouseCombinationID = @WarehouseCombinationID)
)
SELECT TOP (@PageSize) * FROM Paging PG
WHERE PG.rn > (@PageNumber * @PageSize) - @PageSize
SET @TotalRecords = @@ROWCOUNT
END
Je le fais généralement de cette façon - je n'ai jamais vraiment vérifié si c'était très efficace du point de vue des performances:
WITH YourCTE AS
(
SELECT
(list of columns),
ROW_NUMBER() OVER (ORDER BY ......) AS 'RowNum'
FROM dbo.YourBaseTable
)
SELECT
*,
(SELECT MAX(RowNum) FROM YourCTE) AS 'TotalRows'
FROM
YourCTE
WHERE
RowNum BETWEEN 101 AND 150
Fondamentalement, la valeur RowNum
aura des valeurs comprises entre 1 et le total des lignes (si vous n'avez pas de PARTITION BY
Dans votre CTE) et donc en sélectionnant MAX(RowNum)
, vous obtenez le nombre total de lignes.
Eh bien, j'avais utilisé des tables #temp
Dans le passé, mais j'ai trouvé une autre solution en utilisant Count(..) OVER()
pour trouver le nombre total de lignes il y a quelques jours. Cela fonctionne comme ceci:
SELECT COUNT(id) OVER() [Total], ROW_NUMBER() OVER(ORDER BY id DESC) [RowNo]
, [other columns]
FROM Table
La page de référence est ici .