2013-05-11 39 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

相關問題