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說,我不能這樣做對視圖。
我認爲,如果你使用ORDER BY的一個視圖中,可以如果指定TOP避免錯誤SQL給你一個錯誤。 – Iztoksson
這是正確的 - 在我的示例中指定了TOP,但這意味着我無法根據條件返回總記錄數。除非我人爲地將TOP值設置得非常高 - 但這真的有點像黑客。 –
您可以刪除TOP和ORDER BY,並使用ROW_NUMBER進行分頁,如您在問題中所述。可以這樣工作,當然這意味着你需要更改客戶端應用程序。 – Iztoksson