Select를 통한 변수 선언의 위험성 (101111)
목적 : 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 단까지 처음 부터 끝까지 논리적 디버깅을 실시 해야 할것이다.