행 크기 오류 문제 해결

SQL Server 데이터베이스 엔진에서 식을 평가하기 전에 정렬 작업을 수행하는 경우가 있으므로 SQL Server 2000에서 실행되는 일부 쿼리가 SQL Server 2008에서 오류를 반환할 수 있습니다. 이러한 쿼리는 일반적으로 다음을 지정합니다.

  • 결과 집합에서의 매우 긴 char, nchar, varchar 및 nvarchar 필드

  • ORDER BY, GROUP BY 및 DISTINCT 절과 같이 데이터베이스 엔진에서 정렬 작업을 시작하도록 만들 수 있는 모든 절 및 SQL Server 쿼리 최적화 프로그램에서 정렬이 필요한 Merge Join 알고리즘을 사용하여 해결하는 JOIN 절

데이터베이스 엔진에서는 쿼리 앞부분에 있는 식을 평가하기 전에 정렬 작업을 수행할 수 있습니다. 이렇게 하려면 데이터베이스 엔진에서 중간 결과를 저장할 작업 테이블을 만들어야 합니다. 이 작업 테이블에 8,060바이트의 제한을 초과하는 행을 만들어야 하는 경우 쿼리에서 오류가 반환됩니다.

예를 들어 다음 테이블 집합을 살펴 보십시오.

USE tempdb;
GO
CREATE TABLE t1
    (ch char(6000), vch1 varchar(100), vch2 varchar(100), vch3 varchar(100));
CREATE TABLE t2(i int);
GO
INSERT t1 VALUES(REPLICATE('abc', 2000), 
    '123456789012345678901234567890', '123456789012345678901234567890',
    '123456789012345678901234567890');
INSERT t2 VALUES(7);
INSERT t2 VALUES(13);
GO

이제 다음 쿼리를 살펴 보십시오. SQL Server 2000에서는 이 쿼리가 실행되지만 SQL Server 2008에서는 오류가 반환됩니다.

SELECT ch+ch, vch1, vch2, vch3 
FROM t1, t2 
ORDER BY vch1, i;
GO

SQL Server 2008에서는 데이터베이스 엔진이 SQL Server 2000에서 ORDER BY 절을 평가하는 것보다 일찍 이 절을 평가하며 쿼리 결과 집합에 매우 긴 char 필드가 요청되기 때문에 이 쿼리는 실패합니다. 데이터베이스 엔진에서 작성하는 작업 테이블이 8,060바이트의 제한을 초과하는 행을 하나 이상 지정합니다.

성공적으로 쿼리를 실행하려면 CAST 또는 CONVERT를 사용하여 SELECT 목록에 있는 긴 필드를 모두 varchar(max) 또는 nvarchar(max) 데이터 형식으로 변환합니다. 예를 들어 다음 쿼리는 SQL Server 2005에서 성공적으로 실행됩니다.

SELECT CONVERT(varchar(max),ch+ch), vch1, vch2, vch3 
FROM t1, t2 
ORDER BY vch1, i;
GO

참고 항목

참조

관련 자료