2015-10-26 151 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不会对具有数百万条记录的表产生性能影响,它在运行时会得到执行 –