2010-11-08 89 views
1

在我的SP號碼,我有以下幾點:MSSQL 2008 SP分頁和計算的總記錄

with Paging(RowNo, ID, Name, TotalOccurrences) as 
(
    ROW_NUMBER() over (order by TotalOccurrences desc) as RowNo, V.ID, V.Name, R.TotalOccurrences FROM dbo.Videos V INNER JOIN .... 
) 
SELECT * FROM Paging WHERE RowNo BETWEEN 1 and 50 
SELECT COUNT(*) FROM Paging 

結果是我得到的錯誤:無效的對象名稱「尋呼」。 我可以再次查詢分頁表嗎?我不希望將所有結果的計數作爲新列加入......我寧願將其作爲另一個數據集返回。那可能嗎?

感謝,拉杜

回答

2

更多的研究,我喜歡這樣做的另一種方式後: 或者,你可以在內嵌表值函數並使用它,保存重複主查詢,這樣的包裹CTE了

with Paging(RowNo, ID, Name, TotalOccurrences) AS 
(
    ROW_NUMBER() over (order by TotalOccurrences desc) as RowNo, V.ID, V.Name, R.TotalOccurrences FROM dbo.Videos V INNER JOIN .... 
) 
select RowNo, ID, Name, TotalOccurrences, (select COUNT(*) from Paging) as TotalResults from Paging where RowNo between (@PageNumber - 1)* @PageSize + 1 and @PageNumber * @PageSize; 

我認爲這比調用兩次查詢具有更好的性能。

+0

這不是最快的,我現在花很多時間在這個上面工作。最快的解決方案是獲得一個RowNo,也是一個ReverseRowNo(相反排序),然後通過執行「TotalRecords = RowNo + ReverseRowNo - 1」來計算Total。試試大數據集 - 大量改進。 – 2013-12-03 21:35:14

0

寫 「爲」 CTE表名尋呼如下之後: 與尋呼AS(RowNo,ID,姓名,TotalOccurrences)爲
( ROW_NUMBER()OVER(由TotalOccurrences秩序(*),來自dbo.Videos V INNER JOIN ....
) SELECT * FROM PAING WHERE RowNo BETWEEN 1 and 50 SELECT COUNT(*)FROM Paging

1

你不能這樣做,因爲你正在定義的CTE將o只有在定義後出現的FIRST查詢纔可用。因此,當您運行COUNT(*)查詢時,CTE不再可供引用。這只是CTE的限制。

因此,要將COUNT作爲單獨的步驟執行,您需要不使用CTE,而是將完整查詢用於COUNT。

CREATE FUNCTION dbo.ufnExample() 
    RETURNS TABLE 
AS 
RETURN 
(
with Paging(RowNo, ID, Name, TotalOccurrences) as 
(
    ROW_NUMBER() over (order by TotalOccurrences desc) as RowNo, V.ID, V.Name, R.TotalOccurrences FROM dbo.Videos V INNER JOIN .... 
) 
SELECT * FROM Paging 
) 

SELECT * FROM dbo.ufnExample() x WHERE RowNo BETWEEN 1 AND 50 
SELECT COUNT(*) FROM dbo.ufnExample() x 
1

請注意,Radu D的解決方案的查詢計劃顯示對這些表的雙擊。它正在進行兩次處決。不過,這仍然是最好的方法,因爲我還沒有找到真正可擴展的1查詢設計。

可擴展性較差的1查詢設計是將已完成的有序列表轉儲到@tablevariable,SELECT @@ ROWCOUNT以獲取完整計數,並從@tablevariable中選擇X和Y之間的行數。此操作適用於< 10000行,但結果在數百萬行中,填充@tablevariable變得非常昂貴。

混合方法是將此temp /變量填充到10000行。如果不是全部10000行都填滿了,那麼就設置好了。如果填滿10000行,則需要重新運行搜索以獲得完整的計數。如果大多數查詢返回10000行以下,這很好。 10000的限制是一個粗略的近似值,您可以針對您的情況使用此閾值。

+0

避免使用臨時表或表變量非常快地在大型數據集上進行查詢。您仍然可以完成獲取TotCount而不必創建臨時表,請參閱我的其他評論。 – 2013-12-03 21:36:35