Total RecordCount as OUTPUT of Paged Result Set in Stored Procedure
i have a question on stored procedures.
I try to get a page of result set and the record count of the whole set.
Each of this is working on it's own, but I'm unable to combine it:
ALTER PROCEDURE dbo.pagingSCP
@PageStart INT,
@PageSize INT,
@RecordCount INT OUTPUT
AS
BEGIN
WITH AllRecords AS (
SELECT ROW_NUMBER() OVER (ORDER BY MATNR)
AS Row, viewStyleColorInModul.*
FROM viewStyleColorInModul WHERE SPRAS = 'D'
) SELECT * FROM AllRecords WHERE Row between
@PageStart and @PageStart + @PageSize
END
(50 row(s) returned) @RecordCount = 0 @RETURN_VALUE = 0 Finished running [dbo].[pagingSCP].
ALTER PROCEDURE dbo.pagingSCP
@PageStart INT,
@PageSize INT,
@RecordCount INT OUTPUT
AS
BEGIN
WITH AllRecords AS (
SELECT ROW_NUMBER() OVER (ORDER BY MATNR)
AS Row, viewStyleColorInModul.*
FROM viewStyleColorInModul WHERE SPRAS = 'D'
) SELECT @RecordCount = Count(*) From AllRecords
END
No rows affected. (0 row(s) returned) @RecordCount = 43770 @RETURN_VALUE = 0 Finished running [dbo].[pagingSCP].
Is is now somehow possible to get the 5开发者_C百科0 Rows and the total Recordcount within the single query?
Thanks in advance.
ALTER PROCEDURE dbo.pagingSCP
@PageStart INT,
@PageSize INT,
@RecordCount INT OUTPUT
AS
BEGIN
-- get record count
WITH AllRecords AS (
SELECT viewStyleColorInModul.*
FROM viewStyleColorInModul WHERE SPRAS = 'D'
) SELECT @RecordCount = Count(*) From AllRecords;
-- now get the records
WITH AllRecords AS (
SELECT ROW_NUMBER() OVER (ORDER BY MATNR)
AS Row, viewStyleColorInModul.*
FROM viewStyleColorInModul WHERE SPRAS = 'D'
) SELECT * FROM AllRecords
WHERE Row between @PageStart and @PageStart + @PageSize;
END
You have two distinct queries, therefor eyou run two distinct SELECT and let the SQL optimizer optimize each individually. Even if trying to get both queries in one SELECT is possible, is highly counterproductive and sub-optimal.
As a side note, in the client code any output parameter is available only after iterating all results returned.
Here is the guts of a paging proc we used all the time. It works by first dumping all the matching records into a temp table (WHERE SPRAS = 'D').
It then selects from the temp table, only the records from page X of Y. It also includes the total records of the original selection (WHERE SPRAS = 'D').
ALTER PROCEDURE [dbo].[spSelectTempUsers]
@Page int = 0,
@NumPerPage int = 1
AS
SET NOCOUNT ON
CREATE TABLE #TempData
(
[RowId] [int] identity(1,1) ,
[UserId] [int] ,
[FirstName] [varchar](50) ,
[LastName] [varchar](50) ,
[Email] [varchar](255) ,
[SPRAS] [varchar](36)
)
INSERT INTO #TempData
(
[UserId] ,
[FirstName] ,
[LastName] ,
[Email] ,
[SPRAS]
)
SELECT
[UserId] ,
[FirstName] ,
[LastName] ,
[Email] ,
[SPRAS]
FROM viewStyleColorInModul
WHERE [SPRAS] = 'D'
DECLARE @Count int
DECLARE @Pages int
DECLARE @i int
DECLARE @j int
IF @Page < 1 SET @Page = 1
SET @Count = (SELECT COUNT(RowId) FROM #TempData)
SET @Pages = @Count / @NumPerPage
IF (@Pages * @NumPerPage) < @Count SET @Pages = @Pages + 1
IF @Page > @Pages SET @Page = @Pages
SET @i = ((@Page -1) * @NumPerPage) +1
SET @j = @Page * @NumPerPage
SELECT
ISNULL(t1.UserId,'') as UserId,
ISNULL(t1.FirstName,'') as FirstName ,
ISNULL(t1.LastName,'') as LastName ,
ISNULL(t1.Email,'') as Email ,
ISNULL(t1.SPRAS,'') as SPRAS,
@Pages as Pages,
@Count as TotalRecords
FROM #TempData t1
WHERE t1.RowId >= @i AND t1.RowId <= @j
ORDER BY t1.RowId
DROP TABLE #TempData
SET NOCOUNT OFF
精彩评论