2016-11-08 106 views
0

我使用此查询从表Customers中获取页面和索引受限制的结果。例如:Sql服务器返回选择存储过程中的行数

如果@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 

和下面我写了原来的查询。

是否有一种方法可以返回行,还可以将行数作为标量值返回到同一存储过程中?

+1

你必须做两个查询,没有办法绕过它。如果您喜欢(通过将第一个结果分配给变量)或使用输出参数,仍然可以将这些查询组合到一个结果集中。 (从技术上讲,你可以在一个查询中填充第一个查询中的第一个查询,但这仍然是后台的两个查询。) –

+0

嗯......如果结果中有10行,你可以解释10不是正确的号码?如果您想要获得客户总数,则必须将其作为单独的查询(或子查询)来完成。 –

+1

它可以用窗口聚合来完成,但大多数人报告性能比运行两个单独的查询更差 –

回答

1

我认为你正在寻找这样的东西。只需返回总数与结果集。这种情况并不少见,尤其是在SP中,ssrs和其他报告工具为每条记录返回重复数据。

DECLARE @TotalCount INT=SELECT COUNT(*) FROM Customers 
SELECT 
    Name, LastName, City, [email protected]      
    FROM Customers         
OFFSET @iStartIndex ROWS 
FETCH NEXT @iRowsPerPage ROWS ONLY 
+0

我想到了这个解决方案。太。所有结果都将重复10行。如果这并不罕见,为什么不呢。 – FrenkyB

+0

调用两个命令的开销和创建两个数据库连接以获得总计数的可能性远远超过这种情况下的附加有效负载。即使对于几百条记录,我也可以说,复制几个字段元数据或聚合。 –