【问题标题】:Loading up data from a SQL Server database?从 SQL Server 数据库加载数据?
【发布时间】:2025-12-02 19:30:01
【问题描述】:

我有一个包含数百万行的大表。我需要在一个程序中处理所有这些。

我只对studentId 一栏感兴趣。如何编写查询以加载 2000 个这些项目,然后将其提供给程序进行处理,然后获得下一批 2000 个等等?

问题是我如何跟踪我已经处理了哪些项目,列表没有排序。

编辑:我需要做的过程是: 我有一个 [studentId, name, DepartmentId] 形式的表格

这里的学生人数很容易达到 30 到 4000 万。他们所属的各个部门通常可能有数千个...因此 DepartmentId 的范围可能在 5000 到 6000 之间。行可以穿插。 现在我需要获取属于特定部门的所有学生,并在一个程序中处理他们。我不能一次加载一百万个学生 ID,所以我需要进行某种批处理。 谢谢。

【问题讨论】:

  • 您可以手动使用 ROW_NUMBER rn... WHERE rn BETWEEN x 和 y 将其放入一个循环中,每次迭代将变量增加 2000
  • 你需要做什么样的过程?
  • 嗨@DanBracuk,我添加了一个编辑。
  • 你使用的是哪种前端技术???

标签: sql sql-server


【解决方案1】:

您可以使用SqlDataReader,阅读每个批次,处理它,然后继续阅读,直到完成。仅在完成所有批次后关闭阅读器。

你可以change the isolation level if locking is a problem

【讨论】:

    【解决方案2】:

    如果我们多次运行我们的选择,SQL Server 不保证在结果中具有相同的顺序。

    所以你有两个选择:

    1. 排序表并使用OFFSET FETCH 子句。 (或使用TOP 子句,但TOP 不是标准功能)。您可以将ROW_NUMBEROVER 一起使用。但在这种情况下,OFFSET 更简单,性能更好。
    2. 或在WHERE 子句(WHERE BETWEEN)中使用您的 ID 密钥。

    【讨论】:

      【解决方案3】:

      如果是 MYSQL,你可以这样做

      SELECT studentId from [TABLE_NAME] LIMIT 0,2000
      

      您只需要循环您的代码或 SP 并更改 LIMIT 数字。

      【讨论】:

      • 但它是 sql server。阅读标签。