MSSQL 데이터 형식 우선순위

개요

MSSQL 데이터 형식 우선순위는 서로 다른 형식의 데이터를 연산자로 결합했을 때 , 낮은 순위의 데이터형식이 높은 순위의 데이터 형식으로 변환되게 되는데, 이 때의 우선순위를 말합니다.

WHERE 절에 적용되는 예제

-- 테이블 및 데이터 생성
CREATE TABLE T_A1 (
  C1 VARCHAR(10) PRIMARY KEY
  , C2 INT
  )

INSERT INTO T_A1 (C1, C2 )
SELECT VALUE, VALUE 
FROM GENERATE_SERIES(100, 200)

-- 쿼리 실행
SELECT * 
FROM T_A1
WHERE C1 = '155'

SELECT * 
FROM T_A1
WHERE C1 = 155

두 번째 쿼리에서, C1 컬럼은 VARCHAR 인데, 이보다 높은 우선순위인 INT 를 C1 컬럼의 조건으로 줬을 때, C1 컬럼을 INT 로 변환하는 과정이 두 번째 그림에서 보입니다. 쿼리 작성시 WHERE 절의 왼쪽을 가공하지 말라는 내용과 같은 맥락이라고 볼 수 있을텐데, 어쨌든 예제에서는 차이가 미미하지만, 상황에 따라 실행시간에 커다란 차이가 있을 수도 있습니다.

그 외 암시적 변환 예제

-- 1번
DECLARE @A INT
SET @A = 1
SELECT @A + 'B' 
-- 2번
DECLARE @A VARCHAR(2)
SET @A = 1
SELECT @A + 'B' 
-- 3번
DECLARE @A INT
SET @A = 1
SELECT @A + '2'

모두 마지막 SELECT 절에서 변환이 일어나는데, 1번은 INT + ‘B’ 인데, INT 가 우선순위가 높으므로 ‘B’ 를 INT 로 변환시도 중 에러 발생, 2번은 @A 가 VARCHAR 이므로 ‘1B’ 라는 결과가 나오고, 3번은 ‘2’ 를 INT 로 변환이 가능하므로 INT 3 이 결과가 됩니다.

그러면 아래 쿼리는 어떻게 될까요?

DECLARE @A INT
SET @A = 1
SELECT CONCAT(@A, 'B')

정상적으로 1B 가 표시됩니다. CONCAT 함수는 입력 파라미터를 받을 때 모두 문자형식으로 암시적으로 변환을 하기때문입니다.

MSSQL 데이터 형식 우선순위 표

MSSQL 데이터 형식 우선순위 표

관련 MS 문서

Comments

No comments yet. Why don’t you start the discussion?

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다