2010-03-30 44 views
3

好吧我有一個表在我的SQL Server數據庫中存儲註釋。我的願望是能夠使用[Back],[Next],頁碼& [Last]按鈕在我的數據列表中查看記錄。我認爲最有效的方法是使用僅在特定範圍內返回特定行數的存儲過程。以下是我想出了幫助!我如何從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]按鈕。換句話說,我想返回我的第一個選擇語句中的總行數,即

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

@@ rowcount不起作用並引發錯誤。我也無法計數。*要麼工作。

有沒有另一種方式來獲得總的行數或我的方法註定。

+0

設定了參數小時google搜索解決方案,我開始後認爲數據分頁只爲精英保留:-( – 2010-03-30 22:44:20

回答

4

我已經處理了這個問題,非常,並在最後我找到的解決辦法沒有屈指可數,其中很壯觀,但做的工作:

  1. 查詢兩次
  2. 返回計數爲一體列
  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 

一個明顯的缺點是,如果查詢很昂貴,那麼你要做兩次。

在第二種解決方案中,您只需將計數作爲結果的一部分返回。然後,您將從業務層代碼中的第一條記錄中選擇計數。優點是您只需執行一次昂貴的查詢。缺點是你在結果中每行返回一個額外的四個字節。

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 

第三個解決方案是第二次在該變體你的東西,結果到一個臨時表,並從第一個記錄

... 
    , @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 
+0

+1謝謝。我現在看到除了你所說的那些之外沒有其他的選擇,我可能會選擇第二個,它有點混亂,但比重新查詢要好得多。我認爲只有精英們知道有一個'魔術'Rowcount命令! – 2010-03-31 07:16:35

5

要獲得的評論總數的頁面,將需要一個單獨的查詢:

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

只有這樣,才能把這個數據早在相同的查詢是將數據存儲爲一個子查詢在主存儲過程上,並返回存儲過程中每行的總數。

+0

我也想到了這一點,但認爲有更好的方法,那裏只有幸運的少數人知道..我猜那裏沒有。+1 – 2010-03-31 07:20:09