본문 바로가기

SQL Server/SQL Server Tip & Tech

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 합니다.

 

INSERT T (a)

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;

 

 

이럴 일이 얼마나 있을까 싶지만, 참고하세요~