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);
방금 (같은 것을 사용하여 준비 테이블에 스프레드 시트를 가져올 수 없습니다 : (당신이 anypoint에서 2005으로 업그레이드하는 경우) 완성도를 위해서
는 UPSERT을 수행하는 것이 바람직 옵션은 MERGE입니다 SSIS)가 거기서 데이터를 상향 조정합니까? 행 단위로 처리하는 것보다 훨씬 효율적입니다. – GarethD나는 그 말을 포스트에서 생각하기로했다. 나는 우리 작업용 데이터베이스에 스테이징 테이블을 만들고 거기에서 갈 것입니다. 저는 지난 몇 개월 동안 SQL에 접속하고 있습니다. UPSERT가 유효한 진술 인 경우, 나는 그것을 연구하고 그것이 내가 실제로 무엇을 찾고 있는지를 볼 수 있습니다. – Daniel
나는 위의 성명서가 내가 귀 뒤에 얼마나 젖었는지 반영한다. 이것은 나를 위해 좋은 선생님 일을 할 수 있습니다! – Daniel