2013-05-11 15 views
5

シナリオ:SQL ServerからC#.Netコンソールアプリケーションに行をフェッチしており、ストアドプロシージャを使用してSQL Serverから取得したデータに対して処理を実行しています。アクションが実行された後、新しいデータはC#-MongoDB-Driverを使用してMongoDBに格納されます。SQL Serverからレコードを一括してフェッチする最適な方法は

問題:数十億行があります。私のストアドプロシージャには次のようなクエリが含まれています。

select * from table_name 

バッチ単位のロジックを使用するには、ID列も日付列もありません。

情報:今のところ、アプリケーションが3500件までのレコードをフェッチしている - 5000のレコードとのMongoDBに格納し、それは以下の通りであるエラースロー:

System.Runtime.InteropServices.SEHExceptionを(0x80004005):外部コンポーネントが例外をスローしました。

質問:誰でも/バッチ式読み取りのために働くSQL Serverからのフェッチするために私にいくつかのロジックを提案することはできますか?

答えて

9

をFETCH OFFSETまたはあなたが行を一意に識別できるようにする列(複数可)、...上向きにあなたは、このようなROW_NUMBERを使用することができ、2005年に、その後、UniqueKeyそれを呼び出すことができます

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 

あなたは本当に1、あなたが使用することができますを追加することのないユニークキーや可能性を持っていない場合は...

ROW_NUMBER() OVER (ORDER BY (SELECT 0)) 

...レコードが中に保存されていることを自然な順序を試してみて、維持する。しかし、あなたに応じて、これは、あなたが望むように正確に動作することを保証するものではありません。したがって、移行をテストすることはさらに重要になりますが、とにかくこれをやっていると確信しています;-)

7

MSSQL 2012を使用する場合は、OFFSET-FETCH節を試してください。それは最高の解決策です!

EXAMLE:受注BY SELECT ... ORDERを使用すると、SQL Serverの2012年にOFFSET-FETCHを使用して、テーブルを仮定すると、主キーを持っていることができない場合は25行が次の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)..... 
+0

質問タグはSQL Server 2008を使用していることを示唆しています – davmos

+0

MS SQL 2012にあります。しかし、私たちはMS SQL 2008と2008 R2にあります。お時間をいただきありがとうございます.. –

関連する問題