본문 바로가기
RDB/MSSQL

[MSSQL] OUTPUT INTO 원본 데이터 사용하기

by kigo23 2024. 5. 23.
반응형

데이터를 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;

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 할 수 있다.