2012-11-03 46 views
1

article here的幫助下以及SO專家最近的回答中,我得到了以下內容,這將幫助我有效地翻閱一組記錄。返回cte的總記錄

我覺得我過去的問題是

  1. 看我怎麼包括有效載荷中的Total Number of Records末SQL CTE的 稱爲「總」。你是這麼做的嗎?
  2. 其他建議?更簡潔或改進的潛在領域? Return Total Number of Pages

DECLARE @page_size INT = 5; 
DECLARE @page_nbr INT = 4; 
DECLARE @search NVARCHAR(MAX) = ''; 
DECLARE @sort_order INT = 2; 

WITH AllProducts 
AS 
(
SELECT *, 
CASE @sort_order 
    WHEN 1 THEN ROW_NUMBER() OVER (ORDER BY ProductID) 
    WHEN 2 THEN ROW_NUMBER() OVER (ORDER BY ProductName) 
END AS 'Seq'  
FROM Products 
), 
Filtered 
AS 
(
SELECT * FROM AllProducts 
WHERE ProductName like '%'[email protected]+'%' 
OR 
@search is null 
) 
SELECT (select COUNT(*) from Filtered) as 'Total', * FROM Filtered 
WHERE seq > (@page_nbr - 1) * @page_size 
    AND seq <= @page_nbr * @page_size 
+0

無法獲得 – Rod

+0

你是怎麼做的,它的格式嗎?通常我沒有粘貼sql的問題。請刪除我的圖像。 – Rod

+0

如果代碼出現在塊引用或列表中,則必須爲每個嵌套級別縮進更多四個空格。由於這太費時,我只是添加了一條水平線來打破這個列表。 –

回答

1

我覺得有什麼不對您的疑問:它的數字記錄(呼叫),之後應用過濾器。

例如,您可能會請求記錄的第2頁,但同時可以過濾出所有具有相應seq值的記錄。因此,在這種情況下,查詢不會產生任何結果,儘管表中可能有大量記錄。

爲了解決這個問題,你可以做同樣的CTE過濾和記錄編號,像這樣:

DECLARE @page_size INT = 5; 
DECLARE @page_nbr INT = 4; 
DECLARE @search NVARCHAR(MAX) = ''; 
DECLARE @sort_order INT = 2; 

WITH Filtered AS (
    SELECT *, 
     CASE @sort_order 
      WHEN 1 THEN ROW_NUMBER() OVER (ORDER BY ProductID) 
      WHEN 2 THEN ROW_NUMBER() OVER (ORDER BY ProductName) 
     END AS 'Seq' 
    FROM AllProducts 
    WHERE ProductName like '%'[email protected]+'%' OR @search is null 
) 
SELECT (select COUNT(*) from Filtered) as 'Total', * FROM Filtered 
WHERE seq > (@page_nbr - 1) * @page_size 
    AND seq <= @page_nbr * @page_size