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
'연구개발 > SQL2005' 카테고리의 다른 글
[SQL 2005 GUIDE] 캐시와 풀 (0) | 2009.07.24 |
---|---|
[SQL 2005 GUIDE] SQL Server 2005 memory - 1탄 (0) | 2009.07.24 |
[SQL 2005 GUIDE] varchar(max) 열이 행 내에 저장되는지 확인하는 스크립트 (0) | 2009.07.24 |
[SQL 2005 GUIDE] xml 데이터 유형을 활용하세요 (0) | 2009.07.23 |
[SQL 2005 GUIDE] Wait 점검 스크립트 (0) | 2009.07.23 |