반응형

text, image 데이터 형식에 비해 큰 값 데이터 형식이 가지는 장점 중 한가지가 큰 값 데이터 형식에는 문자열에 사용 가능한 문자열 함수들을 사용할 수 있다는 것입니다. 그렇지만 문자열 함수를 사용할 때 유의해야 할 점이 있습니다.

 

명시적으로 그 문자열 함수를 적용하고자 하는 식이 varchar(max)라는 것을 알려 주지 않으면, 문자열 함수는 기본적으로 식을 문자열 데이터 형식으로 간주한다는 점입니다.

 

예를 들어 다음 스크립트를 보면 @max 라는 로컬 변수는 varchar(max)로 정의되어 있습니다. 그런데 replicate 함수를 사용하여 10000 바이트 크기의 문자열을 만들어서 @max 변수에 저장하려고 하면 실제로는 @max 변수에 8천 바이트만 저장됩니다. 문자열 함수의 결과를 저장할 그릇을, 문자열 데이터 형식을 기준으로 준비하는 것으로 판단됩니다. 그래서 함수 결과가 문자열 데이터 형식의 최대 크기인 8000 바이트까지만 인식하는 거죠.

 

 

 

DECLARE @max varchar(max)

SELECT @max = replicate('1234567890', 1000)

SELECT @max, datalength(@max)

GO

--> 8000 바이트

 

 

만일 다음과 같이 CAST('1234567890' AS varchar(max) 라고, 식이 varchar(max)라는 것을 SQL Server에게 미리 알려 주면 이 replicate 함수는 다음과 같이 10000 바이트를 정상적으로 처리합니다.

 

 

DECLARE @max varchar(max)

SELECT @max = replicate(CAST('1234567890' AS varchar(max)), 1000)

SELECT @max, datalength(@max)

GO

--> 10000 바이트

 

 

 

문자열 결합 연산자인 + 도 마찬가지입니다.

다음 예에서와 같이 replicate 함수를 적용한 다음에 varchar(max)로 변환해 보았자 이미 8000 바이트까지만 인식되었기 때문에 데이터가 8천 바이트까지만 인식됩니다.

 

 

DECLARE @max varchar(max)

SELECT @max = CAST(replicate('max test 1', 800) +

                   replicate('max test 2', 800) AS varchar(max))

SELECT datalength(@max)

GO

--> 8000 바이트

 

 

다음과 같이 + 연산자를 적용할 식 중 하나라도 varchar(max)로 정의하거나, + 연산자를 적용할 식 중 하나에 CAST 함수를 적용하면 원하는 결과를 얻을 수 있습니다.

DECLARE @max1 varchar(max), @max2 varchar(max), @max3 varchar(max)

SELECT @max1 = replicate('max test 1', 800)

SELECT @max2 = replicate('max test 2', 800)

SELECT @max3 = @max1 + @max2

SELECT datalength(@max3)

GO

-- 16000

DECLARE @max varchar(max)

SELECT @max = CAST(replicate('max test 1', 800) AS varchar(max))

  + replicate('max test 2', 800)

SELECT datalength(@max)

GO

-- 16000

 


반응형

+ Recent posts