MERGE
[MSSQL] MERGE를 사용하여 데이터 입력/수정/삭제를 한 번에 처리
MERGE 구문 수행 도중 다음과 같은 오류가 발생했다. 이를 해결해보자!
메시지 10710, 수준 15, 상태 1, 줄 5
'DELETE' 유형의 동작은 MERGE 문의 'WHEN NOT MATCHED' 절에 사용할 수 없습니다.
'UPDATE' 유형의 동작은 MERGE 문의 'WHEN NOT MATCHED' 절에 사용할 수 없습니다.
메시지 10710, 수준 15, 상태 1, 줄 5
An action of type 'DELETE' is not allowed in the 'when not matched' clause of a MERGE statement.
An action of type 'UPDATE' is not allowed in the 'when not matched' clause of a MERGE statement.
먼저 MERGE 구문에 대해 간단히 살펴보면, 다음과 같다.
MERGE 타겟테이블명 AS A
USING 기준테이블명 AS B ON A.컬럼명 = B.컬럼명
WHEN MATCHED THEN 일치할때쿼리문
WHEN NOT MATCHED THEN 불일치할때쿼리문;
그리고 위의 오류 메시지가 반환된 MERGE 문은 다음과 같다.
MERGE TARGET_TABLE AS A
USING SOURCE_TABLE AS B ON A.ID = B.ID
WHEN NOT MATCHED THEN UPDATE SET C_STATE = 'DEL';
--WHEN NOT MATCHED THEN DELETE;
기준 테이블과 타겟 테이블의 데이터가 불일치할 경우 (NOT MATCHED)에서
UPDATE/DELETE 구문을 사용하기 위해서는 NOT MATCHED BY SOURCE를 사용하면 된다.
NOT MATCHED BY SOURCE/TARGET
1. NOT MATCHED BY SOURCE
: 타겟 테이블에는 해당 데이터가 있지만, 기준 테이블에 없는 경우
> 타겟 테이블의 특정 rows를 DELETE 할 수 있다.
> 타겟 테이블의 특정 rows를 UPDATE 할 수 있다.
2. NOT MATCHED BY TARGET (=NOT MATCHED)
: 기준 테이블에는 해당 데이터가 있지만, 타겟 테이블에는 없는 경우
> 타겟 테이블에 새로운 rows를 INSERT 할 수 있다.
NOT MATCHED BY SOURCE를 적용하여, 수정된 정상 쿼리
MERGE TARGET_TABLE AS A
USING SOURCE_TABLE AS B ON A.ID = B.ID
WHEN NOT MATCHED BY SOURCE THEN UPDATE SET C_STATE = 'DEL';
--WHEN NOT MATCHED BY SOURCE THEN DELETE;
+ 추가사항
NOT MATCHED BY SOURCE 외의 추가 조건이 필요할 경우 다음과 같이 적용
MERGE TARGET_TABLE AS A
USING SOURCE_TABLE AS B ON A.ID = B.ID
WHEN NOT MATCHED BY SOURCE AND A.ID = 3 THEN DELETE;
'프로그래밍 > MSSQL' 카테고리의 다른 글
[MSSQL] ARITHABORT (웹 서비스단 프로시저 timeout 이슈) (0) | 2020.01.31 |
---|---|
[MSSQL] RECOMPILE 저장 프로시저 리컴파일 (c# 프로시저 timeout 에러) (0) | 2020.01.30 |
[MSSQL] BULK INSERT (CSV/TXT 파일 결과 저장 & 파일 INSERT) (1) | 2019.12.18 |
[MSSQL] 사용자 정의 데이터 형식을 이용한 프로시저 집합기반 처리 (프로시저 테이블 파라미터 TVP) (0) | 2019.12.17 |
[MSSQL] 트랜잭션 로그 보기 (0) | 2019.12.16 |