한 테이블 (모든 varchar)에서 다른 테이블 (형식)에 C #으로 데이터를 복사하고 유효성을 검사하는 방법

c# entity-framework sqlbulkcopy

문제

[참고 : SSIS 또는 이와 유사한 서비스를 사용할 수없는 코드에 있어야합니다.]

C # 및 EF를 사용하여 한 데이터베이스에서 다른 데이터베이스로 데이터를 대량 복사해야합니다.

문제는 소스 데이터가 모두 varchar (최대)이며 올바른 데이터 유형의 대상을 원한다는 것입니다. 근원은 아주 잘 작동하는 오래된 ETL 일에서 역사적인이고 나는 대체 될 수 없다. 제가 보았던 가장 일반적인 문제는 숫자 필드에 알파가 있습니다 - 예를 들어 돈 필드의 "none"입니다. 이것들은 모두 varchar이기 때문에 소스에서 괜찮습니다.

데이터를 복사하고 유효성을 검사하고 싶습니다.
source -> validate -> destination
가능한 가장 간단한 방법으로 유효성 검사가 실패하면 실패한 정확한 행 (그리고 이상적으로는 실패한 행)을 알아야 원본에서 수동으로 수정하고 데이터를 다시 복사 할 수 있습니다.

10에서 1.7M 행 사이에 약 50 개의 테이블이 있습니다! 따라서 속도 또한 중요합니다.

이것을 접근하는 합리적인 방법은 무엇입니까? DTO, 검증 속성 및 오토 맵을 작성 하시겠습니까? 두 개의 EF 엔티티 및 행별로 매핑하고 각 행을 확인 하시겠습니까? SPROC 및 수동 삽입?

수락 된 답변

연결된 서버 로 T-SQL에서 수행하십시오 .

즉 :

--begin a transaction to wrap validation and load
BEGIN TRAN

--Validate that no tickets are set to closed without a completion date
SELECT * 
FROM bigTableOnLocalServer with (TABLOCKX) -- prevent new rows
WHERE ticketState = '1' /* ticket closed */ and CompletionDate = 'open' 

--if validation fails, quit the transaction to release the lock
COMMIT TRAN

--if no rows in result set 1, execute the load
INSERT INTO RemoteServerName.RemoteServerDBName.RemoteSchema.RemoteTable (field1Int, Field2Money, field3text)
SELECT CAST(Field1 as int), 
    CASE Field2Money WHEN 'none' then null else CAST(Field2Money as money) END,
    Field3Text
FROM bigTableOnLocalServer
WHERE recordID between 1 and 1000000

-- after complete, commit the transaction to release the lock
COMMIT TRAN

서버간에 직접 통신 할 수없는 경우에도 SQL에서 유효성 검사를 수행하고 C # 클라이언트를 사용하여 데이터를 디스크에 쓰고 대상 서버의 대량 삽입 기능을 누르십시오. C # 구성 요소는 데이터를 전송하는 것 이상을 수행 할 것이므로 BULK INSERT , à la CSV에서 사용할 수있는 형식으로 곧바로 이동합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.