SQL Server/SQL Server Tip & Tech

INSERT.. SELECT 문에서 대상 테이블에 직접 INSERT 되지 않은 컬럼을 OUTPUT INTO 문으로 담기

르매 2013. 5. 10. 12:28

던전스트라이커 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;

 

 

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