SQL 2005最佳“分页”

时间:2010-05-18 12:57:39

标签: c# .net sql sql-server-2005

使用自定义分页创建记录“网格”时,使用C#查询记录总数以及记录起始端的最佳/最佳方式是什么?

返回分页记录集的SQL:

SELECT Some, Columns, Here FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY Column ASC) AS RowId, *
    FROM
        Records
    WHERE
        (...)
) AS tbl
WHERE ((RowId > @Offset) AND (RowId <= (@Offset + @PageSize)) )

用于计算记录总数的SQL:

SELECT COUNT(*) FROM Records WHERE (...)

现在,我两次前往服务器:一次是获取记录,另一次是计算记录总数。

组合这些查询以避免多次数据库迁移的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

您可以将存储过程与输出参数(或返回值)一起使用以传递总行数。

create procedure dbo.Stuff_GetAll (
    @StartRowIndex int, -- zero based
    @MaximumRows int
)
as
begin
    declare @TotalRows int

    select @TotalRows = count(*) 
    ...

    if (@TotalRows > 0 and @MaximumRows > 0)
    begin
        ;with T as (
            select *, row_number() over ()
            ...
        )
        select T.* from T
        where Row between @StartRowIndex + 1 and (@StartRowIndex + @MaximumRows)
    end

    return @TotalRows
end
GO

您可能只想在请求第一页时查询count()(可能非常昂贵)。

答案 1 :(得分:2)

我找到的最快的方法是返回结果集中的行数:

With PagedItems As
    (
    Select ...
        , ROW_NUMBER() OVER ( ORDER BY Column ASC ) As Seq
        , ROW_NUMBER() OVER ( ORDER BY Column DESC ) As ReverseSeq
    From Table
    Where ....
    )
Select ..., ( ReverseSeq + Seq - 1) As TotalRows
From PagedItems
Where RowId > @Offeset
    ANd RowId <= ( @Offset + @PageSize )

答案 2 :(得分:0)

一种方法是将查询转换为存储过程,然后使用输出参数来计算总记录数。您将在过程中填充输出参数,然后以与现在相同的方式返回记录集。