【发布时间】:2018-04-11 15:26:19
【问题描述】:
这可能是一件非常简单的事情,但是我在 SQL Server、TSql 甚至普通 SQL 方面都不是很全面。
我需要从一个非常大的表(200 万条记录)中检索所有记录,并且我在其他地方使用提取的数据作为制表符分隔的文件。
我正在编写一个存储过程来获取此信息,但是所有 200 万条记录都太大了,因此我需要使用用户设置的行限制 (@BatchSize) 使用多个选择语句返回数据。
此特定表上的 PK 不是连续的,因此在末尾使用 WHERE BETWEEN 并不理想,因为每个 Select 调用返回不同数量的记录。在循环中设置 SELECT TOP (@BatchLimit) 只会一遍又一遍地返回相同的 X 记录。
有没有办法让它返回@BatchLimit # 个记录,然后从它停止的地方继续?这听起来像是光标的工作,但作为一个在我不确定之前从未使用过光标的人。任何帮助将不胜感激!
【问题讨论】:
-
您可以利用 OFFSET FETCH 来处理这类事情。这是一篇关于该主题的精彩文章。 sqlperformance.com/2015/01/t-sql-queries/…
-
我认为使用 SSIS 是一种更简单的生成文件的方法。
-
您是否正在尝试创建多个文件(即根据用户输入将 200 万个文件分成多个块)?如果不是,那么我不确定您为什么要使用分页。如果你是一个带有 OFFSET FETCH @SeanLange 的 while 循环,应该会为你处理好它。
-
谢谢你。我不知道 OFFSET FETCH,但是,我无法使用它,因为我在旧版本的 SQLServer 上 :(。我想我已经决定尝试使用 TOP(@BatchSize) 和 WHERE id > @ LastId。我会尝试从每个选择中提取最后一个 id 并从那里开始,但 Offset 会更好
-
您应该标记您使用的 SQL 版本。如果您将数据放在分隔文件中,您应该能够从那里读取最后一个值。
标签: sql sql-server tsql