相关疑难解决方法(0)

使用ROW_NUMBER时从SQL Server返回总记录

我想返回数据库中的记录总数,以便我可以设置分页.在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 …
Run Code Online (Sandbox Code Playgroud)

sql-server paging sql-server-2008-r2

30
推荐指数
2
解决办法
3万
查看次数

为什么窗口聚合函数的逻辑读取如此之高?

我发现在使用公共子表达式假脱机的执行计划中,报告的逻辑读取对于大型表来说非常高.

经过一些试验和错误后,我发现了一个似乎适用于下面的测试脚本和执行计划的公式. Worktable logical reads = 1 + NumberOfRows * 2 + NumberOfGroups * 4

我不明白为什么这个公式成立的原因.这比我想象的更有必要看一下这个计划.任何人都可以通过吹嘘这个帐户的内容来打击这个吗?

或者失败那是否有任何方法来跟踪每个逻辑读取中读取的页面,以便我可以自己解决?

SET STATISTICS IO OFF; SET NOCOUNT ON;

IF Object_id('tempdb..#Orders') IS NOT NULL
  DROP TABLE #Orders;

CREATE TABLE #Orders
  (
     OrderID    INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
     CustomerID NCHAR(5) NULL,
     Freight    MONEY NULL,
  );

CREATE NONCLUSTERED INDEX ix
  ON #Orders (CustomerID)
  INCLUDE (Freight);

INSERT INTO #Orders
VALUES (N'ALFKI', 29.46), 
       (N'ALFKI', 61.02), 
       (N'ALFKI', 23.94), 
       (N'ANATR', 39.92), 
       (N'ANTON', 22.00);

SELECT PredictedWorktableLogicalReads = 
        1 + …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2008

22
推荐指数
1
解决办法
2584
查看次数

CTE,ROW_NUMBER和ROWCOUNT

我试图返回一个数据页面,并在一个存储过程中的所有数据的行计数,如下所示:

WITH Props AS
(
    SELECT *,
    ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber
    FROM Property
    WHERE PropertyType = @PropertyType AND ...
)   

SELECT * FROM Props 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize);
Run Code Online (Sandbox Code Playgroud)

我无法返回行计数(最高行号).

我知道这已经讨论过了(我已经看过了: 使用row_number从查询中获取@@ rowcount的有效方法)但是当我在CTE中添加COUNT(x)OVER(PARTITION BY 1)性能降低并且上面的查询通常没有时间需要永远执行.我估计这是因为计算了每一行的数量?我似乎无法在另一个查询中重用CTE.Table Props有100k记录,CTE返回5k记录.

sql sql-server row-number rowcount common-table-expression

11
推荐指数
1
解决办法
4万
查看次数

如何通过TOP*选择返回记录总数

我有超过30万行,即使我使用TOP*语句只选择20/50/100记录,我想返回记录的总数.

是否可以过滤选择之类的

select top 50 * from table where rule1=rule1 and rule=rule2

假设数据库为300 000并且上面选择的记录总数将返回4 000条记录.但实际上它只返回50条记录,我需要知道manu是如何在数据库中使用这个where语句(它将返回4000).

谢谢

sql t-sql select count

2
推荐指数
1
解决办法
5028
查看次数