1

我正在运行一个检索 20 行的查询(例如)。我想知道是否有 21 个,以便我可以相应地启用“下一页”按钮。目前,我正在检索 pageSize + 1 并返回一个布尔值作为 out 参数,根据是否检索到 21 个(在这种情况下)行来为其分配值,但实际上只会将 20 个作为列表返回。这意味着我正在检索一个额外的查询,然后我会忽略这对于性能来说并不理想,并且我不想运行 count(*) 因为它完全是另一个查询。

注意:使用 pageddatasource 并不是一个真正的选择,必须坚持使用 rowlimit 并开始行。

感谢您的任何建议。

4

6 回答 6

2

2个查询:

  1. 结果页面
  2. 然后结果总数

第一个查询将包含页面和页面大小,第二个查询将为您提供总行数。使用此信息,您可以计算总页数并将其呈现给用户。

于 2012-06-26T12:23:18.493 回答
1

您可以使用嵌套查询,如下所示:

 select    TOP 20 *,
           (select count(*) from tableName) as TotalCount
 from      tableName

然后每一行都会有总列,所以你可以检查一下。

或者,您可以使用此语法,避免嵌套选择。当您有其他谓词(不必在嵌套选择中重复)时,这将变得更加方便:

 select    TOP 20 *, count(*) over() as TotalCount
 from      tableName
于 2012-06-26T12:26:15.220 回答
1
  1. 获取count(*) 一次。用它来显示页数。
  2. 用户每次点击页码,获取20条记录
于 2012-06-26T12:30:58.363 回答
1

我怀疑在同一个数据库访问中检索一个额外的行(21 对 20)在性能方面几乎可以忽略不计。

于 2012-06-26T12:25:51.027 回答
0

这是一个使用 row_number 的

–-Change these two variable to parameters of your
–-actual stored procedure

Declare @PageNumber int
Declare @PageSize int


–-Assume we need page 6 i.e. records from 51-60
Select @PageNumber=6
Select @PageSize=10


–-Select only those records which
–-fit into a single page
Select Top(@PageSize) * from
(
Select
RowID=ROW_NUMBER() OVER (ORDER BY Name),
ProductID,Name,ProductNumber,ListPrice,
TotalRows=Count(*) OVER() --Count all records
from Production.Product
) A
Where A.RowId > ((@PageNumber-1)*@PageSize)
于 2012-06-26T12:36:24.603 回答
0

尝试这个

Select *,Row_Number .... as RowNo
into #Table
from Table

Select * 
from #Table
WHERE RowNo > @FirstRec AND RowNo < @LastRec

Select count(*)
from #Table
于 2012-06-26T12:29:32.313 回答