【问题标题】:Total RecordCount as OUTPUT of Paged Result Set in Stored ProcedureTotal RecordCount 作为存储过程中分页结果集的 OUTPUT
【发布时间】:2010-11-04 14:53:09
【问题描述】:

我有一个关于存储过程的问题。

我尝试获取结果集的页面和整个集合的记录数。

每个都是独立的,但我无法将它组合起来:

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 Rows 和总 Recordcount 在单个查询中?

提前致谢。

【问题讨论】:

    标签: sql stored-procedures records rowcount


    【解决方案1】:
    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 中获取两个查询 是 可能的,也会适得其反并且次优。

    附带说明,在客户端代码中,任何输出参数只有在迭代所有返回的结果后才可用。

    【讨论】:

    • 这也正是我们的想法。
    【解决方案2】:

    这是我们一直使用的分页过程的内容。它首先将所有匹配的记录转储到一个临时表中(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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多