3

OK、SQL Server データベースにコメントを格納するテーブルがあります。データ リストの [戻る]、[次へ]、ページ番号、[最後] ボタンを使用して、レコードをページングできるようにしたいと考えています。最も効率的な方法は、特定の範囲内の特定の数の行のみを返すストアド プロシージャを使用することだと考えました。これが私が思いついたものです

@PageIndex INT, 
@PageSize INT,
@postid int


AS
 SET NOCOUNT ON  
 begin

WITH tmp AS ( 
SELECT comments.*, ROW_NUMBER() OVER (ORDER BY dateposted ASC)  AS  Row
    FROM    comments
    WHERE     (comments.postid = @postid))

SELECT tmp.*
FROM tmp
WHERE Row between 

(@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize

end

RETURN 

これですべて正常に動作し、データ リスト ページャーに [次へ] ボタンと [戻る] ボタンを実装できました。ここで、ページ番号と [Last] ボタンをページャーに実装できるように、(現在のページではなく) すべてのコメントの合計数が必要です。つまり、最初の select ステートメントで合計行数を返したい

  WITH tmp AS ( 
    SELECT comments.*, ROW_NUMBER() OVER (ORDER BY dateposted ASC)  AS  Row
        FROM    comments
        WHERE     (comments.postid = @postid))
set @TotalRows = @@rowcount

@@rowcount は機能せず、エラーが発生します。また、count.* も機能しません。

行の合計量を取得する別の方法はありますか、それとも私のアプローチは運命づけられていますか?

4

2 に答える 2

5

ページのコメントの総数を取得するには、別のクエリが必要です。

SELECT TotalRows = COUNT(*)
FROM comments
WHERE comments.postid = @postid

このデータを同じクエリに戻す唯一の方法は、データをプライマリ ストアド プロシージャのサブクエリとして格納し、ストアド プロシージャの各行の合計を返すことです。

于 2010-03-30T23:07:21.800 に答える
4

私はこの非常に問題に対処しましたが、最終的に、どれも素晴らしいものではありませんが、仕事をするいくつかの解決策を見つけました:

  1. クエリを 2 回
  2. カウントを列の 1 つとして返します
  3. カウントを列として返しながら、結果を一時テーブルに詰め込みます

最初のソリューションでは、次のようにします。

    ...
    , @Count int OUTPUT
AS 
Select @Count = (
                Select Count(*)
                From comments
                Where comments.postid = @postid
                    And Col1 = ... And Col2 = ...
                )

With NumberedResults As
    (
    Select ...
        , ROW_NUMBER() OVER( ORDER BY dateposted ASC ) As Num
    From comments
    Where Col1 = ... And Col2 = ...
    )
Select ...
From NumberedResults
Where Num Between ( @PageIndex - 1 ) * @PageSize + 1 and @PageIndex * @PageSize

明らかな欠点は、クエリが高価な場合、2 回実行することです。

2 番目のソリューションでは、結果の一部としてカウントを返すだけです。次に、ビジネス層コードの最初のレコードからカウントを取得します。利点は、高価なクエリを 1 回だけ実行することです。欠点は、結果の行ごとに余分な 4 バイトを返すことです。

With NumberedResults As
    (
    Select ...
        , ROW_NUMBER() OVER( ORDER BY dateposted ASC ) As Num
    From comments
    Where Col1 = ... And Col2 = ...
    )
Select ...
    , ( Select Count(*) From NumberedResults ) As TotalCount
From NumberedResults
Where Num Between ( @PageIndex - 1 ) * @PageSize + 1 and @PageIndex * @PageSize

3 番目のソリューションは、結果を一時テーブルに詰め込み、最初のレコードから out パラメータを設定するという点で、2 番目のソリューションの変形です。

    ...
    , @TotalCount int OUTPUT
AS

Declare @PagedResults Table (
                            Col1 ...
                            , ...
                            , TotalCount int
                            )
With NumberedResults As
    (
    Select ...
        , ROW_NUMBER() OVER( ORDER BY dateposted ASC ) As Num
    From comments
    )
Insert @PagedResults( Col1...., TotalCount )
Select ...
    , ( Select Count(*) From NumberedResults ) As TotalCount
From NumberedResults
Where Num Between ( @PageIndex - 1 ) * @PageSize + 1 and @PageIndex * @PageSize

Set @TotalCount = ( Select TOP 1 TotalCount From @PagedResults )

Select ...
From @PagedResults
于 2010-03-30T23:15:32.693 に答える