部分获取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