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

Amo*_*rni 8 c# sql-server sql-server-2008 sql-server-2008-r2 c#-4.0

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

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

select * from table_name
Run Code Online (Sandbox Code Playgroud)

为了计算出一些批处理逻辑,没有标识列,也没有任何日期列等.

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

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

问题:任何人都可以向我建议一些逻辑来解决从SQL Server批量读取/获取的问题吗?

小智 9

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

EXAMLE:SELECT ... ORDER BY orderid OFFSET 25 ROWS FETCH NEXT 25 ROWS ONLY

__PRE__


dav*_*mos 9

如果您无法OFFSET-FETCH在SQL Server 2012中使用并假设该表具有允许您唯一标识行的主键或列,请调用它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
Run Code Online (Sandbox Code Playgroud)

如果你真的没有唯一的密钥或添加一个的可能性,那么你可以使用...

ROW_NUMBER() OVER (ORDER BY (SELECT 0))
Run Code Online (Sandbox Code Playgroud)

...尝试保留记录存储的自然顺序.但是,根据您的数据结构,这并不能保证完全按照您的要求工作.因此,测试迁移将更加重要,但我相信你无论如何都会这样做;-)