场景:我们从SQL Server获取行到C#.Net控制台应用程序,并通过存储过程对从SQL Server检索到的数据执行操作;执行操作后,使用C#-MongoDB-Driver将新数据存储到MongoDB中。
问题:有数十亿行。我的存储过程包含如下查询:
select * from table_name
要计算出一些批处理逻辑,没有标识列,也没有任何日期列等。
信息:截至目前,应用程序正在获取最多3500 - 5000条记录并存储到MongoDB中,然后抛出错误,如下所示:
System.Runtime.InteropServices.SEHException(0x80004005):外部组件引发了异常。
问题:任何人都可以向我建议一些逻辑来解决从SQL Server批量读取/获取的问题吗?
答案 0 :(得分:9)
如果使用MSSQL 2012尝试OFFSET-FETCH子句。这是最好的解决方案!
EXAMLE:SELECT ... ORDER BY orderid OFFSET 25 ROWS FETCH NEXT 25 ROWS 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).....
答案 1 :(得分: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))
...尝试保留记录存储的自然顺序。但是,根据您的数据结构,这不能保证完全按照您的意愿工作。因此,测试迁移会更加重要,但我相信无论如何你都会这样做; - )