반응형
데이터를 Insert할 때 특정 컬럼의 값이 유동적인 Default 값으로 Insert된다면 해당 값을 OUTPUT INTO 를 통해 inserted.{column_name} 으로 받아올 수 있다. 하지만 INSERT SELECT 를 하게 될 때에 SELECT한 값을 OUTPUT과 함께 받아오는 것은 불가능하다. 이 상황에 대안 방법으로 MERGE INTO를 사용하는 것이 고려된다.
--소스 테이블
CREATE TABLE sourceTable (
id int IDENTITY (1, 1) NOT NULL,
data int NOT NULL
);
--타겟 테이블
CREATE TABLE targetTable (
id int IDENTITY (1, 1) NOT NULL,
data int NOT NULL
);
--소스, 타겟 키 매칭 테이블
CREATE TABLE sendLog (
id int IDENTITY (1, 1) NOT NULL,
sourceId int NOT NULL,
targetId int NOT NULL
);
--테스트용 데이터 삽입
INSERT INTO sourceTable (data) VALUES (1);
INSERT INTO sourceTable (data) VALUES (2);
INSERT INTO sourceTable (data) VALUES (3);
INSERT INTO targetTable (data) VALUES (99);
우선 테스트를 위하여 위와 같은 테이블과 데이터를 생성한다. sourceTable에서 targetTable로 데이터를 옮기고, sourceTable의 id값과 targetTable에 insert된 id값을 sendLog에 저장하기 위함이다.
--잘못된 방식
INSERT INTO targetTable (data)
OUTPUT sourceTable.id, inserted.id INTO sendLog (sourceId, targetId)
SELECT data FROM sourceTable;
inserted를 통하여 삽입된 id 값은 가져올 수 있지만 sourceTable의 id값은 참조할 수 없다.
--해결법
MERGE INTO targetTable
USING sourceTable AS src
ON 0 = 1
WHEN NOT MATCHED THEN INSERT (data) VALUES (src.data)
OUTPUT src.id, inserted.id INTO sendLog (sourceId, targetId);
위와 같이 MERGE INTO 를 통하여 소스 테이블의 값과 삽입된 id 값을 동시에 가져와 sendLog에 Insert 할 수 있다.
'RDB > MSSQL' 카테고리의 다른 글
The server principal "{login}" is not able to access the database "{db_name}" under the current security context. (0) | 2024.07.12 |
---|---|
create sys procedure (0) | 2024.07.05 |
참고용 index include (0) | 2024.04.05 |
트랜잭션로그복원 (0) | 2024.03.27 |
[MSSQL] 이미 존재하는 DB 복원 실패 (0) | 2024.02.05 |