8

シナリオ: SQL Server から C#.Net コンソール アプリケーションに行をフェッチし、ストアド プロシージャを介して SQL Server から取得したデータに対してアクションを実行しています。アクションが実行された後、新しいデータは C#-MongoDB-Driver を使用して MongoDB に保存されます。

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

select * from table_name

バッチ単位のロジックを実行するために、ID 列も日付列もありません。

情報: 現在、アプリケーションは最大 3500 ~ 5000 レコードのレコードを取得して MongoDB に格納していますが、次のようなエラーがスローされます。

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

質問: SQL Server からのバッチ単位の読み取り/フェッチを行うためのロジックを提案してくれる人はいますか?

4

2 に答える 2

9

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

例:SELECT … ORDER BY orderid OFFSET 25 ROWS次の 25 行のみをフェッチします。

これは、このクエリが 25 から 50 のレコードを返すことを意味します。このORDER BY節は必須なので、order を使用したくない場合は、ORDER BY (SELECT NULL)

于 2013-05-11T06:37:17.210 に答える
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
于 2013-05-11T06:51:28.730 に答える