2016-08-31 4 views
0

UI에서 저장 프로 시저로 데이터 테이블을 전달합니다. 해당 매개 변수의 유형은 테이블에 존재 삭제해야 할 데이터 테이블에없는 다음과 같은MERGE를 사용하여 데이터 삭제 또는 삽입

Personkey int 
ComponentKey varchar 

이 데이터는 테이블에 갈 필요 구조 및 데이터와 사용자 정의 테이블 필드입니다.

예 테이블 데이터

PersonKey  ComponentKey 
123   A1 
456   B9 

그리고 내 데이터 테이블 2 행 하나 일치하는 행 및 하나의 새로운 행

예 데이터 테이블 데이터

PersonKey ComponentKey 
123   A1 
786   Z6 

결과가를 갖는다는 456/B9 행을 삭제해야하며 123/A1 행에 아무 것도 일어나지 않아야하며 786/Z6 행이 삽입되어야합니다.

저는 MERGE 문을 사용할 수 있다고 믿지만 그것을 형성하는 방법을 모르겠습니다.

내가 알지 못하는 부분은 삽입해야하지만 삭제 부분은 어디로 들어 왔는가?

MERGE Components 
USING @passedInData 
ON PersonKey = DatatblPersonKey AND ComponentKey = DatatblComponentKey 

WHEN MATCHED THEN 
-- DO nothing... 

WHEN NOT MATCHED 
INSERT (PersonKey, ComponentKey) VALUES (DatatblPersonKey, DatatblComponentey); 

편집 : 데이터 테이블에는 동일한 개인 키에 대해 많은 행이 포함될 수 있지만 구성 요소 키는 다를 수 있습니다.

예 데이터 테이블 데이터

PersonKey ComponentKey 
123   Z6 
123   C5 

예 테이블 데이터

PersonKey  ComponentKey 
123   A1 
456   B9 

상기 데이터 테이블을 삽입 한 후 그 결과이어야

PersonKey ComponentKey 
123   Z6 
123   C5 
456   B9 

공지 123/A1이 삭제되었음을 456/B9는 여전히 테이블에 있습니다.

답변

0

기본값 "WHEN NOT MATCHED"는 사용자가 실제로 의미하는 것이 "목표와 일치하지 않는 경우"라고 가정합니다. 간단한 명령 "DELETE"를 사용하여 "SOURCE NOT MATCHED BY SOURCE"에 대한 다른 명령.을 수행 할 수 있습니다.

지정한 비교에 따라 원본과 일치하지 않는 대상의 모든 레코드가 대상에서 삭제되므로주의해야합니다. 해당 작업에 대한 대상의 하위 집합을 수행해야하는 경우 해당 필터와 함께 cte를 사용하고 대상으로 해당 cte를 병합 할 수 있습니다.

편집 ... 내가 말하고 무엇을 후크하는 방법을 보여주는 :이 방법은 작동하지 않았다으로

DECLARE @databaseTable TABLE (PersonKey INT, ComponentKey VARCHAR(10)); 
INSERT INTO @databaseTable 
VALUES 
    (123, 'A1'), 
    (456, 'B9'); 
DECLARE @appDataset TABLE (PersonKey INT, ComponentKey VARCHAR(10)); 
INSERT INTO @appDataset 
VALUES 
    (123, 'Z6'), 
    (123, 'C5'); 

WITH cteTarget AS 
    (
    SELECT dt.PersonKey 
     , dt.ComponentKey 
    FROM @databaseTable AS dt 
    JOIN (SELECT DISTINCT PersonKey FROM @appDataset) AS pk 
     ON pk.PersonKey = dt.PersonKey 
    ) 
MERGE cteTarget AS tgt 
USING @appDataset AS src 
    ON src.PersonKey = tgt.PersonKey 
    AND src.ComponentKey = tgt.ComponentKey 
WHEN NOT MATCHED BY SOURCE THEN 
    DELETE 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT 
     (PersonKey 
     ,ComponentKey) 
    VALUES 
     (src.PersonKey 
     ,src.ComponentKey); 

SELECT * FROM @databaseTable; 
+0

나는 내 질문에 업데이트되었습니다. – andrewb

+1

당신의 실행은 효과가 없을 수도 있지만 접근법은 효과적 일 수 있습니다. 귀하의 문제에 대한 데이터 및 코드화 된 솔루션의 구조를 포함하도록 답변을 편집했습니다. 다시 말하지만, 당신의 목표가 정확히 무엇인지 정의 할 때주의해야합니다. – btberry

관련 문제