2015-10-08 91 views
0

我有一個相當標準的查詢,當我想要獲取MS SQL中的數據子集時,用於分頁記錄。返回MS SQL Server中的數據子集的總記錄數

我想要做的是儘可能高效地返回一個總計記錄計數。

還有一些關於SO的其他問題可以解決這個問題,在返回所需的子集之前使用ROW_NUMBER()時,實質上獲得了記錄總數。

這些解決方案似乎並沒有爲我工作,這不僅是因爲在這種特殊情況下,我用視圖工作,似乎我無法不先指定一個TOP值使用ROW_NUMBER();因此總行數只包含子集。

任何人都可以提出一種返回總數的方法,因爲我在SQL Server 2008中的視圖上運行以下代碼?

DECLARE 
    @PageSize INT = 10 
, @CurrentPage INT = 1 
; 

WITH o AS 
     (
      SELECT TOP (@CurrentPage * @PageSize) 
        [RowNumber]  = ROW_NUMBER() OVER (ORDER BY [t_YourTable].[IndexedField] DESC) 
      ,  [t_YourTable].[Field1] 
      ,  [t_YourTable].[Field2] 
      ,  [t_YourTable].[Field3] 
      ,  [t_YourTable].[Field4] 
      ,  [t_YourTable].[IndexedField] 

      FROM [t_YourTable] 

      ORDER BY 
        [t_YourTable].[IndexedField] DESC 
     ) 

SELECT 
      [Field1] 
     , [Field2] 
     , [Field3] 
     , [Field4] 
     , [IndexedField] 

FROM o 

WHERE 
     [RowNumber] BETWEEN ((@CurrentPage - 1) * @PageSize + 1) 
AND (((@CurrentPage - 1) * @PageSize) + @PageSize) 

ORDER BY 
     [RowNumber] 

如果我能擺脫TOP說法,我認爲我可以簡單地算RowNumber現場並返回的結果集的一部分 - 但SQL Server說,我不能這樣做對視圖。

+0

我認爲,如果你使用ORDER BY的一個視圖中,可以如果指定TOP避免錯誤SQL給你一個錯誤。 – Iztoksson

+0

這是正確的 - 在我的示例中指定了TOP,但這意味着我無法根據條件返回總記錄數。除非我人爲地將TOP值設置得非常高 - 但這真的有點像黑客。 –

+0

您可以刪除TOP和ORDER BY,並使用ROW_NUMBER進行分頁,如您在問題中所述。可以這樣工作,當然這意味着你需要更改客戶端應用程序。 – Iztoksson

回答

0

看來我可以使用TOP (100) PERCENT得到這個工作,它允許我然後計算子選擇中的行。我不確定這是多麼高效,所以我會很感激任何反饋。

我的代碼變成:

DECLARE 
    @PageSize INT = 10 
, @CurrentPage INT = 1 
; 

WITH o AS 
     (
      SELECT TOP 100 PERCENT 
        [RowNumber]  = ROW_NUMBER() OVER (ORDER BY [t_YourTable].[IndexedField] DESC) 
      ,  [t_YourTable].[Field1] 
      ,  [t_YourTable].[Field2] 
      ,  [t_YourTable].[Field3] 
      ,  [t_YourTable].[Field4] 
      ,  [t_YourTable].[IndexedField] 

      FROM [t_YourTable] 

      ORDER BY 
        [t_YourTable].[IndexedField] DESC 
     ) 

SELECT  (SELECT COUNT(*) FROM o) AS TotalRows 
     , [Field1] 
     , [Field2] 
     , [Field3] 
     , [Field4] 
     , [IndexedField] 

FROM o 

WHERE 
     [RowNumber] BETWEEN ((@CurrentPage - 1) * @PageSize + 1) 
AND (((@CurrentPage - 1) * @PageSize) + @PageSize) 

ORDER BY 
     [RowNumber]