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