部分获取SQL结果

部分获取SQL结果,sql,sql-server-2008,query-optimization,Sql,Sql Server 2008,Query Optimization,我知道我可以使用TOP关键字限制接收结果的数量,但是有没有一种方法可以使用之类的东西来接收下一个结果,比如说1000个结果,这会让我每次缓存1000个结果 因此,假设我的查询有100000个,第一次运行得到1-1000个,我希望收到1000-2000个,以此类推。您可以使用 使用该函数可以根据需要在子查询或中对数据进行排序。然后从该子查询/CTE中选择所需的值(例如,其中RowNum>1000和RowNum当数据在查询之间更改时,RowNum/between解决方案将为您提供下一个数据块的近似值

我知道我可以使用
TOP
关键字限制接收结果的数量,但是有没有一种方法可以使用
之类的东西来接收下一个结果,比如说1000个结果,这会让我每次缓存1000个结果

因此,假设我的查询有100000个,第一次运行得到1-1000个,我希望收到1000-2000个,以此类推。

您可以使用


使用该函数可以根据需要在子查询或中对数据进行排序。然后从该子查询/CTE中选择所需的值(例如,
其中RowNum>1000和RowNum当数据在查询之间更改时,RowNum/between解决方案将为您提供下一个数据块的近似值

如果需要从固定结果中获取特定数据块,请将所有结果插入表中,然后根据需要使用数据。在再次刷新表中的数据之前,结果将保持固定


当您必须获得准确的下一个集合(向前或向后)时,此功能非常有效。这可能会很有用,具体取决于您的情况。

假设有下表

create table #temp
(
    ID int Identity(1,1) ,
    name varchar(1000)
)
假设表中有以下记录

select * from #temp

我们首先声明以下变量

Declare@PageIndex INT
//表示表示页码的起始索引

Declare@PageSize INT
//要在页面中显示的记录总数

Set @PageIndex = 1
Set @PageSize = 10
我将页面大小设置为10,因为我的表中只有15条记录。但您可以将此数字替换为1000条甚至更大

SELECT * FROM 
(
        SELECT ROW_NUMBER() OVER (ORDER BY ID)
        AS Row, * FROM #temp
)T WHERE Row between 
(@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize
如果执行以下查询,屏幕截图中将显示以下记录

当使用下面的查询移动到第二页时

Declare @PageIndex INT
Declare @PageSize INT

set @PageIndex = 2
set @PageSize = 10

SELECT * FROM 
(
   SELECT ROW_NUMBER() OVER (ORDER BY ID)
   AS Row, * FROM #temp
)T WHERE Row between 
(@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize
结果将显示在屏幕截图下方

因此,同样地,您可以检查1000条记录

希望这对你有帮助


如果有任何困惑,请告诉我。

原因是什么?根据您的标签,这似乎是为了优化。但您能解释更多关于这一点吗?我了解这种方法,特别是使用回答中建议的
ROW\u NUMBER()
,因为
ROW\u NUMBER()
是动态生成的,这意味着基础数据源中的微小更改很可能会中断整个过程。+1表示关于在使用ROW_NUMBER()的查询之间更改数据的警告。
Declare @PageIndex INT
Declare @PageSize INT

set @PageIndex = 2
set @PageSize = 10

SELECT * FROM 
(
   SELECT ROW_NUMBER() OVER (ORDER BY ID)
   AS Row, * FROM #temp
)T WHERE Row between 
(@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize