2014-05-13 3 views
2

ERP 용 테이블에 많은 정보를 삽입/업데이트해야하는 경우가 있습니다. 먼저 정보가 존재하는지 확인하기 위해 표를 확인해야합니다. 그렇지 않으면 삽입하십시오. 그렇다면 업데이트하십시오.큰 Excel 파일을 사용하여 SQL 삽입/업데이트

아래 샘플 코드가 있습니다.

IF NOT EXISTS(SELECT * FROM EXT00101 WHERE PT_Window_ID='ITEM_SHIP_MAINT' and PT_UD_Key='18 RND PA' and PT_UD_Number=5) 
    BEGIN 
      INSERT INTO EXT00101 VALUES('ITEM_SHIP_MAINT', '18 RND PA', 5, '70') 
    End 

IF EXISTS(SELECT * FROM EXT00101 WHERE PT_Window_ID='ITEM_SHIP_MAINT' and PT_UD_Key='18 RND PA' and PT_UD_Number=5) 
    BEGIN 
     UPDATE EXT00101 
     SET STRGA255='70' 
     WHERE PT_Window_ID='ITEM_SHIP_MAINT' and PT_UD_Key='18 RND PA' and PT_UD_Number=5; 
    END 

23,000 + 회선이있는 Excel 파일에 대해 편지 병합을 사용했습니다. 이로 인해 내 SQL 문은 260,000+ 회선이됩니다. 이것을 완료하는보다 효율적인 방법이 있어야합니다.

그렇지 않은 경우이 코드를 상당히 분해해야합니다.

마이크로 소프트 SQL 서버 2005

+0

방금 ​​(같은 것을 사용하여 준비 테이블에 스프레드 시트를 가져올 수 없습니다 : (당신이 anypoint에서 2005으로 업그레이드하는 경우) 완성도를 위해서

는 UPSERT을 수행하는 것이 바람직 옵션은 MERGE입니다 SSIS)가 거기서 데이터를 상향 조정합니까? 행 단위로 처리하는 것보다 훨씬 효율적입니다. – GarethD

+0

나는 그 말을 포스트에서 생각하기로했다. 나는 우리 작업용 데이터베이스에 스테이징 테이블을 만들고 거기에서 갈 것입니다. 저는 지난 몇 개월 동안 SQL에 접속하고 있습니다. UPSERT가 유효한 진술 인 경우, 나는 그것을 연구하고 그것이 내가 실제로 무엇을 찾고 있는지를 볼 수 있습니다. – Daniel

+0

나는 위의 성명서가 내가 귀 뒤에 얼마나 젖었는지 반영한다. 이것은 나를 위해 좋은 선생님 일을 할 수 있습니다! – Daniel

답변

0

SSIS를 사용하여 바로 트랙에 당신을 얻을하려면 첫 번째 단계는 준비 테이블 생성하기 위해 사용하는 SQL 실행 작업을하는 것입니다 :

IF (OBJECT_ID(N'dbo.tmpEXT00101Staging') IS NOT NULL 
    DROP TABLE dbo.tmpEXT00101Staging; 

CREATE TABLE dbo.tmpEXT00101Staging 
(  PT_Window_ID VARCHAR(50) NOT NULL, 
     PT_UD_Key  VARCHAR(50) NOT NULL, 
     PT_UD_Number INT NOT NULL, 
     STRGA255  VARCHAR(50) NOT NULL 
); 

그런 다음 데이터를 사용합니다 데이터를이 테이블 (플랫 파일 또는 Excel 소스, 대상은 OLE DB 대상)으로 가져 오는 흐름 작업 데이터 흐름 작업의 "지연 유효성 검사"를 false로 설정하거나 "외부 메타 데이터 유효성 검사" 대상이 런타임에 만들어 지므로 대상에서 false로 변경). 또한 스테이징 테이블을 영구적으로 보관할 수 있으며 대신 각 실행의 시작시 TRUNCATE TABLE dbo.tmpEXT00101Staging을 사용하여 스테이징 테이블을 지울 수 있습니다.

BEGIN TRAN; 

-- UPDATE ROWS THAT EXIST 
UPDATE t 
SET  STRGA255 = st.STRGA255 
FROM dbo.EXT00101 t 
     INNER JOIN dbo.tmpEXT00101Staging st 
      ON st.PT_Window_ID = T.PT_Window_ID 
      AND st.PT_UD_Key = t.PT_UD_Key 
      AND st.PT_UD_Number = t.PT_UD_Number; 

-- INSERT ROWS THAT DO NOT EXIST 
INSERT EXT00101 (PT_Window_ID, PT_UD_Key, PT_UD_Number, STRGA255) 
SELECT PT_Window_ID, PT_UD_Key, PT_UD_Number, STRGA255 
FROM dbo.tmpEXT00101Staging st 
WHERE NOT EXISTS 
     ( SELECT 1 
      FROM dbo.EXT00101 t 
      WHERE st.PT_Window_ID = T.PT_Window_ID 
      AND  st.PT_UD_Key = t.PT_UD_Key 
      AND  st.PT_UD_Number = t.PT_UD_Number 
     ); 

COMMIT TRAN; 

-- CLEAN UP AND DROP STAGING TABLE (OPTIONAL) 
IF (OBJECT_ID(N'dbo.tmpEXT00101Staging') IS NOT NULL 
DROP TABLE dbo.tmpEXT00101Staging; 

여기에 경쟁 조건을 충족 할 가능성이있는 (당신이 영구적으로 유지하지 않으려면 청소하고 준비 테이블을 드롭)

마지막으로 메인 테이블을 업데이트하려면이 준비 테이블을 사용 따라서 동일한 레코드를 삽입하려고하는 동시 스레드에 의한 무결성 위반을 막을 수있는 제약이 있는지 확인해야합니다.

MERGE dbo.EXT00101 WITH (HOLDLOCK) AS t 
USING dbo.tmpEXT00101Staging AS st 
    ON st.PT_Window_ID = T.PT_Window_ID 
    AND st.PT_UD_Key = t.PT_UD_Key 
    AND st.PT_UD_Number = t.PT_UD_Number 
WHEN MATCHED THEN 
    UPDATE 
    SET STRGA255 = st.STRGA255 
WHEN NOT MATCHED THEN 
    INSERT (PT_Window_ID, PT_UD_Key, PT_UD_Number, STRGA255) 
    VALUES (st.PT_Window_ID, st.PT_UD_Key, st.PT_UD_Number, st.STRGA255); 
+0

고맙습니다. 사실 오늘 아침에 코드를 작성하고 테스트 해 보니 훌륭한 SSIS가 나에게 처음 몇 가지 문제점을 제시했습니다. – Daniel