2015-10-26 148 views
0

爲了實現使用C#, ADO.Net自定義分頁的解決方案,與SQL Server數據庫,讓我們假設以下細節:自定義分頁

Total Records = 1000 
Page Size = 100 

這將意味着有10 pages,我用的是查詢如下:

Min and Max Id (Primary Key)被取出使用標量查詢:

Select Min(Id), Max(Id) from Table; 

Select * from Table where Id >= (Min Record) and Id < (Max Record) 

這裏每一筆交易,Min and Max Record Value增加頁面大小,直到最大記錄達到或超過實際最大值。

該解決方案對於具有連續值的自動增量/標識列可以正常工作,但讓我們假設所使用的列在值中存在間隙,但它們仍可以排序,如1000 values介於Min = 1 and Max = 3000之間。

  • 我有以下可能的解決辦法,一個在下面SO link,其中一個額外的RowId column來達到同樣的建議。

  • 其他選項會打開一個閱讀器和閱讀記錄特定網頁,創建一個列表,從而獲取一個網頁

我最好要被執行Top <PageSize> SQL查詢,在那裏執行從我建議的預定義的行或值開始,而不是開始,因此我將避免創建額外的列,我可以使用斷開連接的體系結構,不需要Reader。

任何建議或指針,請讓我知道如果需要澄清,對於這個問題的任何細節

+0

使用'ROW_NUMBER' –

+0

這就是那裏張貼在討論的SO鏈接,但我想,以避免額外的列創建。 http://stackoverflow.com/questions/758186/how-to-get-n-rows-starting-from-row-m-from-sorted-table-in-t-sql –

+0

你可以使用這個解決方案,但添加在頂部添加一個額外的'SELECT'以排除新列,如果這是不希望的。 –

回答

1

萬一您正在使用SQL Server 2012起,您可以使用

獲取和偏移

例如

-- Variable to hold the offset value 
Declare @RowSkip As int 
-- Variable to hold the fetch value 
Declare @RowFetch As int 

--Set the value of rows to skip 
Set @RowSkip = 20000 
--Set the value of rows to fetch 
Set @RowFetch = 50000 

Select * 
From dbo.tblSample 
Order by (Select 1) 
Offset @RowSkip Row 
Fetch Next @RowFetch Rows Only; 

請參考:Usage 1: Server Side Paging瞭解更多詳情

+0

謝謝,這看起來相當有前途 –

1

可以使用ROW_NUMBER功能在common table expression(CTE)

WITH CTE AS 
(
    SELECT 
    t.*, 
    RN = ROW_NUMBER() OVER (ORDER BY t.ID) 
    FROM dbo.TableName t 
) 
SELECT ID, Col2, Col3, ... 
FROM CTE 
WHERE RN >= (@pageIndedx * @pageSize) AND RN <= (@pageIndedx * @pageSize) + @pageSize 
+0

意識到這種解決方案,它在SO鏈接中發佈,試圖找出一種方法來避免額外列作爲CTE的一部分添加 –

+0

@MrinalKamboj:您不需要選擇包括行號列在內的所有列,只需用'SELECT allcolumnsfromtable'替換SELECT *'。 –

+0

但是,作爲運行時功能的CTE不會對具有數百萬條記錄的表產生性能影響,它在運行時會得到執行 –