【问题标题】:Sql server return number of rows from select stored procedureSql server 从选择存储过程返回行数
【发布时间】:2016-11-08 14:12:03
【问题描述】:

我使用此查询从表客户中获取页面和索引有限的结果。例如:

如果@iStartIndex = 0 且@iRowsPerPage = 10,则结果是从 0 到 10 的 10 行。

    SELECT 
        Name, LastName, City                       
        FROM Customers                                  
    OFFSET @iStartIndex ROWS
    FETCH NEXT @iRowsPerPage ROWS ONLY

我的问题是我还需要该查询中的所有行。例如:如果有 1000 行,查询将只选择 10 行。我需要这 10 行,但我还需要知道结果中有多少行 - 在本例中为 1000 行。

我已经尝试过返回 @@ROWCOUNT,但它返回 10,即最后一次查询的结果。 我还尝试编写一个单独的查询:

SELECT COUNT(*)                
FROM Customers  

下面我写了原始查询。

有没有办法在同一个存储过程中返回行,但也可以将行数作为标量值返回?

【问题讨论】:

  • 你必须做两个查询,没有办法。如果您愿意(通过将第一个查询的结果分配给变量)或使用输出参数,您仍然可以将这些查询组合到一个结果集中。 (从技术上讲,您可以通过将第一个查询填充到子查询中来在一个查询中执行此操作,但这实际上仍然是后台的两个查询。)
  • 嗯...如果结果中有 10 行,您能解释一下 10 不是正确的数字吗?如果您想获取客户总数,则必须将其作为单独的查询(或子查询)进行。
  • 可以使用窗口聚合来完成,但大多数人报告性能比运行两个单独的查询更差
  • @SeanLange - 我还需要所有记录的数量。我使用jTable来显示记录和分页需要所有记录的数量。

标签: sql-server tsql


【解决方案1】:

我认为您正在寻找类似的东西。只需返回带有结果集的总数。这并不少见,尤其是在 SP 中,用于 ssrs 和其他报告工具为每条记录返回重复数据。

DECLARE @TotalCount INT=SELECT COUNT(*) FROM Customers  
SELECT 
    Name, LastName, City, TotalCount=@TotalCount                       
    FROM Customers                                  
OFFSET @iStartIndex ROWS
FETCH NEXT @iRowsPerPage ROWS ONLY

【讨论】:

  • 我已经想到了那个解决方案。也。毕竟结果将在 10 行中重复。如果这不是那么罕见,为什么不呢。
  • 在这种情况下,调用两个命令的开销以及创建两个数据库连接以获得总计数的可能性远远超过了额外的有效负载。我想说,即使是几百条记录,它也更多有效地复制一些元数据或聚合字段。
猜你喜欢
  • 2011-09-25
  • 2016-11-03
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多