2013-05-11 3 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 서버에서 가져 오기 위해 나에게 몇 가지 논리를 제시 할 수 있습니까?

답변

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 
당신이 정말로 시도하고 기록이 저장되는 자연의 질서를 보존 할 고유 키 또는 다음 사용할 수 하나를 추가 가능성 ...

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

을 ...이 없다. 그러나 경우

에 따라 당신의 데이터 구조를 사용하면 원하는 방식대로 정확하게 작동하지 않을 수 있습니다. 따라서 마이 그 레이션을 테스트하는 것이 더 중요 할 것이지만 어쨌든 그렇게 할 것이라고 확신합니다 .-)

7

MSSQL 2012를 사용하는 경우 OFFSET-FETCH 절을 사용하십시오. 그것은 최고의 솔루션입니다!

EXAMLE : OrderID를 통해 선택 ... ORDER는 SQL 서버 2012 년 OFFSET-FETCH를 사용하여 테이블을 가정하는 것은 기본 키가없는 경우 25 개 행이 다음 25 ROWS 만

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에 있습니다 .. 시간 내 주셔서 감사합니다 .. –

관련 문제