2013-05-11 40 views
5

场景:我们正在将SQL Server中的行提取到C#.Net控制台应用程序,并通过存储过程对从SQL Server检索到的数据执行操作;在执行操作之后,使用C#-MongoDB-Driver将新数据存储到MongoDB中。什么是从SQL Server批量提取记录的最佳方式

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

select * from table_name 

,提出了一些间歇逻辑没有标识列,也没有任何日期列或这样的。

信息:截至目前应用程序获取记录高达3500 - 5000个记录和存储到MongoDB的,然后将其抛出一个错误,其如下所示:

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

问题:任何人都可以建议我一些逻辑来制定出间歇读/从SQL Server获取?

回答

9

如果你不能在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)) 

...尝试和保持自然秩序的记录存储。但是,根据您的数据结构,这并不能保证你的工作方式如何。所以,测试迁移将变得更加重要,但我相信你会这么做;-)

7

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

EXAMLE:SELECT ... ORDER BY的OrderID OFFSET 25行FETCH NEXT 25行 ONLY

It means this query will return from 25 to 50 records. 
ORDER BY clause is mandatory, so if dont want to use order, 
just write like: ....ORDER BY (SELECT NULL)..... 
+0

问题标签会建议他们使用SQL Server 2008 – davmos 2013-05-11 06:40:27

+0

是的最好的解决方案,你提出,只要我们是在MS SQL 2012上。但我们在MS SQL 2008和2008 R2上。感谢您的时间.. – 2013-05-11 06:53:37

相关问题