2011-07-02 3 views
0
ALTER PROCEDURE [dbo].[getMessages] 
    -- Add the parameters for the stored procedure here 
    @lastRow int, 
    @sort varchar(9) 
AS 
BEGIN 
    -- Insert statements for procedure here 
    DECLARE @StartRow INT,@EndRow INT 
    SELECT @StartRow = (@lastRow + 1), @EndRow = (@lastRow + 6) 

;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY 
     CASE WHEN @sort = 'votes1' THEN m.votes END DESC, 
     CASE WHEN @sort = 'votes2' THEN m.votes END ASC 
    ) AS rows, 
     m.message, 
     m.messageId, 
     TotalCount = COUNT(m.messageId) OVER (PARTITION BY NULL) 
    FROM 
     tblMessages m 
    WHERE 
     m.deleted != 1 
    ) 
    SELECT * 
    FROM cte WHERE ROWS BETWEEN @StartRow AND @EndRow 
    ORDER BY rows 
END 

これは私が最後の行に渡すことができるフロントエンドでページングに使用する私のprocであり、次に "load more"をクリックすると、次の行を取得し、次の6を取得します。前の6はIDを渡すので、6を表示する場合は次の6に移動し、前の6をもう一度表示します。T-SQLでのページング

どうすればこのprocを修正できますか?

+0

なぜ近い投票ですか? – slandau

+0

私はそうではありませんでしたが、誰かがSQL関連の質問を閉じることに投票していることに気づいています。ありがたいことに5票を要しますが、私はその行動についての改造者にメッセージを送るようになりました(今日2回目)。 –

+1

おそらく彼らはxmlでやっていることを好むかもしれません...;) – NotMe

答えて

2

あなたはしていません。

代わりに、コードを変更してください。 procのキーは@lastrowです。私が最初に@lastrow = 0と仮定しているときに実行します。もし前進すれば、値6で実行しています。

現在の値 - 6を渡すだけです。例えば、 20ページ目の場合は、@lastrowは114になります。コードにあるを差し引き、procをもう一度呼び出します。

+0

これは100万回も簡単でしょう。私はこれを撃つだろう。 – slandau

+0

ありがとう!できます! – slandau

1

あなたは「最後の行」を渡していますが、方向を示すものは何も渡していません。最後の行を渡す代わりに、あなたが望むページ番号を渡すのはなぜですか?ページ1 =行1〜6、ページ2 =行7〜12など。これで、プロシージャは次の行のセットのみを扱うので、状態を記憶する必要はありません。ページング・ストアド・プロシージャーを検索する場合は、実行したいものと同じように多くの例があります。