【问题标题】:What is the best way to fetch records batch-wise from SQL Server从 SQL Server 批量获取记录的最佳方法是什么
【发布时间】:2020-07-16 18:43:29
【问题描述】:

场景:我们正在从 SQL Server 获取行到 C#.Net 控制台应用程序,并通过存储过程对从 SQL Server 检索到的数据执行操作;执行操作后,使用 C#-MongoDB-Driver 将新数据存储到 MongoDB。

问题:有数十亿行。我的存储过程包含如下查询:

select * from table_name

要制定一些批量逻辑,没有标识列,也没有任何日期列等。

信息:到目前为止,应用程序正在获取最多 3500 - 5000 条记录并存储到 MongoDB 中,然后它会抛出如下错误:

System.Runtime.InteropServices.SEHException (0x80004005):外部组件已引发异常。

问题:谁能建议我一些逻辑来解决从 SQL Server 批量读取/获取的问题?

【问题讨论】:

    标签: c# sql-server sql-server-2008 c#-4.0 sql-server-2008-r2


    【解决方案1】:

    如果您不能在 SQL Server 2012 中使用 OFFSET-FETCH 并假设该表具有允许您唯一标识行的主键或列,我们称之为 UniqueKey,然后在 2005 年向上您可以像这样使用ROW_NUMBER...

    SELECT UniqueKey, col2, col3 
    FROM 
    (
      SELECT UniqueKey, col2, col3, ROW_NUMBER() OVER (ORDER BY UniqueKey) AS RowNum 
      FROM YourTable
    ) sub
    WHERE sub.RowNum BETWEEN @startRow AND @endRow
    

    【讨论】:

    • "您可以使用...ROW_NUMBER() OVER (ORDER BY (SELECT 0))...尝试保持记录存储的自然顺序。" - 好吧,那是错误的。 There is no "natural order" - it's a misconception.
    • 在一个名为 4GuysFromRolla 的网站上有 this old article 关于 SQL Server 2000 中的高效分页。我认为它在 2008 年可能仍然有效。值得一试。
    • @ZoharPeled 非常感谢!多年来,我一直怀疑该声明的有效性,但从未确定过确认。所以我现在已经删除了它。也感谢有用的链接,我会看看那些:)
    【解决方案2】:

    如果您使用 MSSQL 2012,请尝试使用 OFFSET-FETCH 子句。这是最好的解决方案!

    示例:SELECT … ORDER BY orderid OFFSET 25 ROWS 仅获取接下来的 25 行。

    这意味着此查询将返回 25 到 50 条记录。 ORDER BY 子句是强制性的,所以如果你不想使用 order,请使用 ORDER BY (SELECT NULL)

    【讨论】:

    • 问题标签表明他们使用的是 SQL Server 2008
    • 是您提出的最佳解决方案,前提是我们使用的是 MS SQL 2012。但我们使用的是 MS SQL 2008 和 2008 R2。感谢您的宝贵时间。
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多