2

我想編寫一個執行以下操作的存儲過程: *返回與查詢匹配的記錄數(以確定向用戶顯示的頁數) *返回另一個記錄集來自當前頁面查詢的記錄的某個子集。SQL Server 2008 R2中的高效分頁

從另一個問題,我在計算器上發現了(對不起,我失去了聯繫),我發現,我們確實分頁這樣的:

SELECT u.* FROM 
(
    SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) as rownum FROM 
    (
     [obscenely long select query] 
    ) 
    as t 
) 
AS u WHERE u.rowNum >= 1 AND u.rowNum <= 20 

,我可以得到由返回的記錄數[骯髒的長期選擇查詢]:

SELECT COUNT(*) AS numRecords from ([obscenely long select query]) AS records 

我想盡可能有效地獲得這兩個記錄集。

我能想出如何做到這一點的唯一方法就是將上述兩種語句都推送到一個存儲過程中。這在我看來是低效率的,有幾個原因:

  • 我寫出來,[猥褻長選擇查詢]兩次,使解決方案更加難以維護/改變(我真的要避免這種情況,如果可能的話) 。
  • 我必須運行[淫穢長選擇查詢],獲取所有可能的記錄(可能是成千上萬),然後再將其縮小到合理的分頁大小,只有在獲取計數時再次運行它。

其他的解決方案我已經試過:

  • 把在它自己的存儲過程[猥褻長選擇查詢(這將導致語法錯誤)。

有什麼可以做的嗎?我應該吸取它並堅持我目前的解決方案,還是有更好的方法來解決這個問題?取決於[obscenely long select query]結構

回答

1

您可以使用一個臨時表或表變量:
- 填寫一個臨時表與匹配行的ID
- 算上臨時表中的行來計算的頁數
- 檢索調用者的結果建立與臨時表的查詢加入了與相關數據庫表

+0

我認爲這可能有效。我會和臨時表玩一下,看看我能做些什麼。謝謝! – Cassie

0

實現分頁一個soluntion是:

你的存儲過程將下列參數

@PageSize INT, 
@PageNumbers INT 

;WITH CTE AS(
     SELECT a, 
       b, 
       ROW_NUMBER() OVER(ORDER BY a) RN 
     FROM TableName 
) 
SELECT * 
FROM CTE 
WHERE RN BETWEEN ((@PageNumbers - 1) * @PageSize + 1) AND (@PageNumbers * @PageSize) 

如果傳遞@PageNumbers = 1和@PageSize = 10 然後

((@PageNumbers - 1) * @PageSize + 1) = ((1 - 1) * 10 + 1) = 1 
and (@PageNumbers * @PageSize) = (1 * 10) = 10 

同樣,如果@PageNumbers = 2 然後

((@PageNumbers - 1) * @PageSize + 1) = ((2 - 1) * 10 + 1) = 11 
and (@PageNumbers * @PageSize) = (2 * 10) = 20 

,你甚至可以硬編碼@您的SP中的PageSize值。