INSERT.. SELECT 문에서 대상 테이블에 직접 INSERT 되지 않은 컬럼을 OUTPUT INTO 문으로 담기
던전스트라이커 OBT가 5일 앞으로 다가왔습니다.
개발 기간의 여유도 있었고 함께 작업하는 동료들이 있어 드래곤네스트 때만큼 힘들지 않네요. ^^
온라인게임 오픈은 인생에서 두 번 할 짓이 못된다고 생각했는데, 여럿이 하니 그렇지도 않은 것 같습니다.
다만, 오픈 직후 찾아올 여러가지 사고와 장애 처리에 대한 압박은 여전합니다.
좀 더 부지런했다면 예상할 수 있는 여러 상황에 대응할 스크립트 들을 많이 만들어 놨을텐데, 그러질 못했다는게 아쉽군요.
(주절 주절 주절~)
요 며칠 SSB의 큐 활성화 SP를 만지작 거렸는데, 그 과정에서 알게된 팁 하나를 공유할까 합니다.
(별건 아니지만...)
작업하다 보니 이런 상황이 생겼습니다.
- S 테이블에는 (a, b) 컬럼이 있습니다.
a |
b |
10 |
100 |
20 |
200 |
- T 테이블에는 (id, a) 컬럼이 있습니다. 단, id 컬럼은 IDENTITY 속성을 가집니다.
id (IDENTITY 속성) |
a |
1 |
90 |
2 |
30 |
- 다음과 같이 T 테이블에 S 테이블의 내용을 INSERT 합니다.
SELECT a FROM S;
(INSERT 후 T 테이블의 상태)
id (IDENTITY 속성) |
a |
1 |
90 |
2 |
30 |
3 |
10 |
4 |
20 |
이 과정에서 제가 원하는 데이터 셋은 T.id, T.a, S.b 입니다.
즉, OUTPUT INTO를 사용하여 아래와 같은 내용을 테이블 변수에 담고 싶은 거죠.
id |
a |
b |
3 |
10 |
100 |
4 |
20 |
200 |
문제는.. OUTPUT 절에서 inserted를 참조하여 id 컬럼과 a 컬럼은 가져올 수 있는데, S테이블의 b 컬럼을 어떻게 가져올 수 있는가? 하는 점이었습니다.
참고로.. UPDATE문과 DELETE문에서 JOIN을 사용하는 경우, 대상 테이블이 아니더라도 참조 테이블의 컬럼을 OUTPUT 절에 사용할 수 있습니다.
그런데 INSERT.. SELECT 문에서만큼은.. SELECT 문에서 참조하는 테이블의 컬럼을 OUTPUT 절에서 사용할 수 없더군요.
즉, 이런 구문은 동작하지 않습니다.
INSERT T(a)
OUTPUT inserted.id, inserted.a, S.b
SELECT a FROM S;
만약, S.a 컬럼이 Key 컬럼일때.. 혹시 JOIN 하면 어떨까 싶어 이렇게도 해봤는데, 역시 되지 않습니다.
INSERT T(a)
OUTPUT inserted.id, inserted.a, S2.b
SELECT S1.a
FROM S S1
INNER JOIN S S2 ON S1.a = S2.a;
그러다 찾은 방법은 MERGE문을 사용하여 INSERT하는 것
MERGE T
USING S
ON 1 = 0
WHEN NOT MATCHED THEN
INSERT (a) VALUES (S.a)
OUTPUT inserted.id, inserted.a, S.b;
이럴 일이 얼마나 있을까 싶지만, 참고하세요~