연구개발/DBA

Select를 통한 변수 선언의 위험성 (101111)

HEAD1TON 2011. 8. 14. 01:28

목적 :  L2 부가서비스 실행 시 TC에서 만든 SP 단에서 발생한 논리적 오류의 원인인 Select를 통한 변수 선언의 문제점을 알아보자.

 

SQL 상에서 변수 선언 후 해당 변수에 값을 입력하는 방법은 크게 2가지 이다.

하나는 Set  다른 하나는 Select 이다.

Set의 단점으로는 한번에 하나씩 선언 할 수 밖에 없지만 Select 시는 여러개의 변수에 값을 선언하는 장점을 가진다.

그렇다면 왜 Set을 통한 변수 매핑방식이 ANSI 표준으로 자리를 잡은 걸까?

 

하기의 코드를 통하여 알아보도록 하자.

 

CREATE TABLE #Test (i int, j varchar(10))

 

INSERT INTO #Test (i, j) VALUES (1, '1Row')

INSERT INTO #Test (i, j) VALUES (1, '2Row')

INSERT INTO #Test (i, j) VALUES (2, '3Row')

INSERT INTO #Test (i, j) VALUES (4, '4Row')

GO

 

DECLARE @j varchar(10)

SELECT @j = j FROM #Test WHERE i = 1

SELECT @j

 

 

 

현재 #Test 테이블에 i=1 인 ROW가 2개 이다. (1Row, 2Row)

그럼 @j에 2개의 ROW 중 어떠한 값이 들어가겠는가?

 결론적으로 2개중 하나의 값이 대입된다.

 

 이번엔 Set을 통한 대입을 시켜보자

DECLARE @j varchar(10)

SET @j = (SELECT j FROM #Test WHERE i = 1)

SELECT @j

결과는 하기와 같다.

메시지 512, 수준 16, 상태 1, 줄 2
하위 쿼리에서 값을 둘 이상 반환했습니다. 하위 쿼리 앞에 =, !=, <, <=, >, >= 등이 오거나 하위 쿼리가 하나의 식으로 사용된 경우에는 여러 값을 반환할 수 없습니다.

 

명확히 에러가 발생하고 있다.

이렇게 에러가 명확히 발생해야 에러 처리 및 논리적 디버깅을 방지 할 수 있다.

만약 Select 로 변수 선언 후 값이 틀리게 나온다면 어플리케이션 단 부터 DB 단까지 처음 부터 끝까지 논리적 디버깅을 실시 해야 할것이다.