2014-07-17 2 views
0

Talend를 사용하여 Excel에서 SQL 테이블로 데이터를 복사합니다. 복사하기 전에 기본 키 열을 확인해야합니다. 키가 데이터베이스에 이미 존재하면 해당 레코드를 업데이트하거나 데이터베이스에 해당 레코드를 삽입해야하며 자동 증가 키가 할당됩니다.Talend에서 Excel에서 SQL로 복사하는 동안 삽입/업데이트

어떻게하면됩니까?

+0

? 기억해 주시면 SQL Server를 사용하고 계시 겠지만 질문에 적절한 RDBMS 태그를 추가하여 여기에 설명하는 것이 유용 할 수 있습니다. 지금 당장 SQL Server 태그를 추가했습니다. 내가 틀렸다면 수정하십시오. – ydaetskcoR

+0

예, SQL Server 만 사용하고 있습니다. 감사. –

답변

0

간단하지만 느린 방법으로 txxxSqlOutput 구성 요소에서 INSERT OR UPDATE 또는 UPDATE OR INSERT (업데이트 또는 삽입이 먼저 시도되는지 여부가 다름) 옵션을 사용하면됩니다. 이것은 RDBMS 구성 요소의 대부분이 SQL 서버 하나를 포함하여 지원됩니다

SQL Server Upsert options

당신이 다음 Update or insert 옵션은 반대의 더 나은 성능과 것이다 삽입보다 더 많은 업데이트를 기대합니다.

또는 데이터베이스를 미리 쿼리 한 다음 데이터 흐름을 사용하여 기본 키의 내부 조인을 데이터베이스에 추가 할 수 있습니다. 일치 사항은 분명히 업데이트되며 거부 (tMap의 다른 데이터 흐름에서 Catch inner join reject 사용)는 분명히 삽입됩니다. TMAP를 함께

Faster way to upsert data

그래서 같이 구성된다 :

tMap configuration to allow for more performant upserts

두 번째 방법이 더욱 확대됨 될 수있는 첫 번째 방법은 삽입하려고하는 큰 데이터 세트를 upserting 특히 각 줄을 한 줄씩 읽은 다음 실패하면 업데이트 문으로 다시 씁니다.

두 번째 이점은 더 이상 의도적으로 실패한 삽입/업데이트를 캐치하고 업데이트/삽입하지 않아도되므로 단일 배치/트랜잭션에 포함될 수 있다는 것입니다. 즉, 작업을보다 강력하게 만들고 오류를보다 적절하게 처리 할 수 ​​있습니다. 사실

0

내가 몇 일 전에 같은 문제에 일하는이 내가 일을하는 방법입니다

  1. 임시 테이블을 SQL로 엑셀의 모든 데이터를로드합니다 (tempory 테이블은 테이블과 동일한 구조를 가지고 있어야합니다
  2. 임시 테이블의 primarykey를 데이터베이스 1과 비교하는 저장 프로 시저를 만듭니다 (다른 업데이트가 없으면 삽입).
  3. ETL 태스크에서 저장 프로 시저로 호출됩니다. . 저장 프로 시저의

예 :

CREATE PROCEDURE [dbo].[up_ImportProductsData] 
    AS 
    BEGIN 
     @Product_PK int,  //Product primary key 
     @Product_Name NVarchar(30) // Product name 

    // we create a cursor on product temporay table 
    DECLARE c_Product CURSOR FOR 
    SELECT Product_PK, 
      Product_NAME, 
    FROM Product_tempory_table 

    //We open the cursor to check product pk one by one 
    OPEN c_Product CURSOR 
    FETCH c_Product CURSOR INTO 
    @Product_PK, @Product_Name 
    WHILE @@fetch_status=0 

    //Checking if the Product_PK exits 
    BEGIN 

    //If the PRimary key doesnt exists then we insert it 
    IF NOT EXISTS(SELECT * FROM dbo.Product_Table 
    WHERE [email protected]_PK) 
    BEGIN 
      INSERT INTO dbo.Product_Table 
        ( 
         Product_PK, 
         Product_NAME 
        ) 
      VALUES ( 

         @Product_PK, @Product_Name 
        ) 
     END 

    //If The primary key exists we update it 
    ELSE 
     BEGIN 
     UPDATE dbo.Product_Table 
     SET [email protected]_Name 

     WHERE Product_PK= @Product_PK 

     END 
    FETCH c_Product INTO 
    @Product_PK, @Product_Name 
    END 
    CLOSE c_Product 
    DEALLOCATE c_Product 

END 
당신이 사용하고있는 RDBMS
+0

이것은 정말로 끔찍합니다, 미안 해요. 왜 훨씬 쉽고 투명하게 처리 할 수있는 ETL 프로그램 (3 단계에서 언급 했음)이있을 때 왜 커서를 사용하여 데이터 목록을 반복 할 수 있습니까?또한 ETL 도구/프로세스를 사용할 수있을 때이 많은 로직을 데이터베이스에 넣지 않아야합니다. – ydaetskcoR

+0

이것들은 SQL Server에서 INSERT 스타일 시트 또는 http://stackoverflow.com/a/108416/2291321과 같이 쉽게 삽입 할 수있는 일렬 삽입과 커밋을 수행합니다. ON DUPLICATE KEY UPDATE'를 사용하거나 출력 컴포넌트에서 INSERT OR UPDATE 옵션을 사용하십시오. – ydaetskcoR

+0

늦게 답장을 드려 죄송합니다. 예, 테이블을 직접 삽입/업데이트하는 대신 이러한 접근 방식을 요구할 수 있습니다. 내 제품은 실제 테이블을 사용하므로 삽입 중에 문제가 발생하면 제 제품이 작동하지 않게됩니다. 그래서 임시 테이블을 만드는이 접근법을 사용하는 것이 더 나을 것이라고 생각합니다. –

관련 문제