从SQL Server批量获取记录的最佳方法是什么?

8

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

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

select * from table_name

为了处理一些批处理逻辑,没有标识列,也没有日期列或类似的列。

信息:目前该应用程序获取3500-5000条记录并存储到MongoDB中,然后会出现以下错误:

System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.

问题:有人能建议我一些逻辑来从SQL Server进行分批读取/获取吗?

2个回答

9

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

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

这意味着此查询将返回第25到50条记录。 ORDER BY 子句是必需的,所以如果不想使用排序,请使用ORDER BY (SELECT NULL)


问题标签表明他们正在使用 SQL Server 2008。 - davmos
是的,您提出的解决方案是最好的,但前提是我们使用的是MS SQL 2012。但是我们使用的是MS SQL 2008和2008 R2。感谢您的时间。 - Amol M Kulkarni

9

如果在SQL Server 2012中无法使用OFFSET-FETCH,并且假设该表具有主键或列(s),可以使您唯一地标识一行,我们称之为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))"来尝试保留记录存储的自然顺序。但这是错误的观念,不存在所谓的“自然顺序”。(详见链接:https://zoharpeled.wordpress.com/2019/09/08/the-natural-order-misconception/) - Zohar Peled
有一篇关于在SQL Server 2000中进行高效分页的旧文章,它来自一个名为4GuysFromRolla的网站。我认为它可能仍然适用于2008年版本。值得一试。 - Zohar Peled
@ZoharPeled 非常感谢!多年来,我一直怀疑这个说法的有效性,但从未确认过。所以现在我已经将其删除。还要感谢您提供的有用链接,我会查看的 :) - davmos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接