[英]Total RecordCount as OUTPUT of Paged Result Set in Stored Procedure
我對存儲過程有疑問。
我嘗試獲取結果集頁面和整個集合的記錄數。
每種功能都可以單獨使用,但無法合並:
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行)@RecordCount = 0 @RETURN_VALUE = 0完成運行[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
沒有受影響的行。 (返回0行)@RecordCount = 43770 @RETURN_VALUE = 0完成運行[dbo]。[pagingSCP]。
現在可以通過某種方式在單個查詢中獲得50行和總Recordcount嗎?
提前致謝。
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
您有兩個不同的查詢,因此您要運行兩個不同的SELECT,然后讓SQL優化器分別對每個查詢進行優化。 即使嘗試在一個SELECT中獲得兩個查詢都是可能的,但這種做法會適得其反,而且效果欠佳。
附帶說明一下,在客戶端代碼中,只有在迭代返回的所有結果之后,任何輸出參數才可用。
這是我們一直使用的分頁過程的勇氣。 首先將所有匹配的記錄轉儲到臨時表中(WHERE SPRAS ='D')。
然后,它從臨時表中僅選擇Y頁面X中的記錄。它還包括原始選擇的總記錄(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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.