sp_dbcmptlevel(Transact-SQL)

업데이트: 2006년 7월 17일

특정 데이터베이스 동작이 지정된 버전의 SQL Server와 호환되도록 설정합니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

sp_dbcmptlevel [ [ @dbname = ] name ] 
    [ , [ @new_cmptlevel = ] version ]

인수

  • [ **@dbname=** ] name
    호환성 수준을 변경할 데이터베이스의 이름입니다. 데이터베이스 이름은 식별자 규칙을 따라야 합니다. namesysname이며 기본값은 NULL입니다.
  • [ **@new\_cmptlevel=** ] version
    데이터베이스가 호환되도록 설정할 SQL Server의 버전입니다. versiontinyint이며 기본값은 NULL입니다. 값은 다음 중 하나여야 합니다.

    60 = SQL Server 6.0

    65 = SQL Server 6.5

    70 = SQL Server 7.0

    80 = SQL Server 2000

    90 = SQL Server 2005

    [!참고] 값 6065는 더 이상 사용되지 않으며 후속 릴리스에서 제거될 예정입니다.

    ms178653.Caution(ko-kr,SQL.90).gif주의:
    SQL Server Management Studio와 SMO(SQL Server Management Objects)는 호환성 수준 60을 지원하지 않습니다. 데이터베이스의 호환성 수준이 60으로 설정된 상태에서 SMO나 Management Studio를 사용하면 일부 작업에서 오류가 발생합니다.

반환 코드 값

0(성공) 또는 1(실패)

결과 집합

매개 변수를 지정하지 않거나 name 매개 변수를 지정하지 않으면 sp_dbcmptlevel에서 오류를 반환합니다.

version 없이 name을 지정하면 SQL Server 2005 데이터베이스 엔진에서는 지정한 데이터베이스의 현재 호환성 수준을 표시하는 메시지를 반환합니다.

주의

SQL Server 2005의 모든 설치에서 기본 호환성 수준은 90입니다. model 데이터베이스의 호환성 수준이 낮은 경우가 아니면 SQL Server 2005에서 만든 데이터베이스는 이 수준으로 설정됩니다. 데이터베이스가 이전 버전의 SQL Server에서 SQL Server 2005로 업그레이드되면 데이터베이스는 기존 호환성 수준을 유지합니다. 이는 시스템 및 사용자 데이터베이스 모두에 적용됩니다. sp_dbcmptlevel을 사용하여 데이터베이스의 호환성 수준을 90으로 변경합니다. 데이터베이스의 현재 호환성 수준을 보려면 sys.databases 카탈로그 뷰의 compatibility_level 열을 쿼리합니다.

이전 버전과의 호환성을 위해 sp_dbcmptlevel 사용

sp_dbcmptlevel 저장 프로시저는 전체 서버가 아니라 지정한 데이터베이스의 동작에만 영향을 줍니다. sp_dbcmptlevel은 SQL Server 이전 버전과 부분적으로만 호환됩니다. 중간 마이그레이션 도구로 sp_dbcmptlevel을 사용하여 관련 호환성 수준 설정에서 제어하는 동작의 버전 차이를 해결할 수 있습니다. 기존 SQL Server 응용 프로그램이 SQL Server 2005의 동작 차이에 의해 영향을 받으면 응용 프로그램이 제대로 실행되도록 변환하십시오. 그런 다음 sp_dbcmptlevel을 사용하여 호환성 수준을 90으로 변경하십시오. 데이터베이스의 새로운 호환성 설정은 다음에 데이터베이스가 현재 데이터베이스로 사용될 때 적용됩니다. 이 때 데이터베이스가 로그온 시에 기본 데이터베이스로 사용되는지 또는 USE 문에서 지정한 경우에 기본 데이터베이스로 사용되는지 여부는 문제되지 않습니다.

인덱싱된 뷰를 포함하는 데이터베이스는 80보다 낮은 호환성 수준으로 변경할 수 없습니다.

최상의 방법

사용자가 데이터베이스에 연결되어 있는 동안 호환성 수준을 변경하면 활성 쿼리에 대해 잘못된 결과 집합이 생성될 수 있습니다. 예를 들어 쿼리 계획을 컴파일하는 동안 호환성 수준이 변경되면 컴파일된 계획이 이전 호환성 수준과 새 호환성 수준을 모두 사용할 수 있으므로 잘못된 계획이 생성되고 결과가 정확하지 않을 수 있습니다. 또한 계획을 계획 캐시에 저장하고 후속 쿼리에 다시 사용하는 경우 문제가 복잡해질 수 있습니다. 잘못된 쿼리 결과를 방지하려면 다음 절차에 따라 데이터베이스의 호환성 수준을 변경하는 것이 좋습니다.

  1. ALTER DATABASE SET SINGLE_USER를 사용하여 데이터베이스를 단일 사용자 액세스 모드로 설정합니다.
  2. 데이터베이스의 호환성 수준을 변경합니다.
  3. ALTER DATABASE SET MULTI_USER를 사용하여 데이터베이스를 다중 사용자 액세스 모드로 설정합니다.
  4. 데이터베이스의 액세스 모드를 설정하는 방법은 ALTER DATABASE(Transact-SQL)를 참조하십시오.

SET 옵션

새 기능이 이전 호환성 수준에서 작동하려면 SET 옵션을 조정해야 합니다. 예를 들어 호환성 수준 80에서 xml 데이터 형식을 사용하려면 ANSI SET 옵션을 적절하게 설정해야 합니다. 또한 데이터베이스 호환성 수준이 90으로 설정된 경우 ANSI_WARNINGS를 ON으로 설정하면 암시적으로 ARITHABORT가 ON으로 설정됩니다. 데이터베이스 호환성 수준이 80 이하로 설정된 경우에는 명시적으로 ARITHABORT 옵션을 ON으로 설정해야 합니다. 자세한 내용은 결과에 영향을 주는 SET 옵션을 참조하십시오.

호환성 수준 및 저장 프로시저

저장 프로시저가 실행될 때 저장 프로시저는 정의된 데이터베이스의 현재 호환성 수준을 사용합니다. 데이터베이스의 호환성 설정이 변경되면 모든 저장 프로시저도 그에 맞게 자동으로 다시 컴파일됩니다.

sp_dbcmptlevel 사용 시 환경 고려 사항

sp_dbcmptlevel 호출은 개별적으로 제출되어야 합니다. sp_dbcmptlevel은 다음과 같은 다른 컨텍스트 내에서 호출할 수 없습니다.

  • 저장 프로시저
  • EXEC(string) 구문으로 실행한 Transact-SQL 문자열
  • Transact-SQL 문의 일괄 처리

수준 60, 65와 수준 70, 80, 90 사이의 차이

호환성 수준을 60 또는 65로 설정하면 많은 동작에 영향을 미칩니다. 이러한 동작들은 다음 표의 왼쪽 열에 나열되어 있습니다.

[!참고] 6.x 응용 프로그램에 영향을 주는 기타 차이점에 대한 자세한 내용은 이 항목의 뒷부분에 나오는 "낮은 호환성 수준과 수준 90 사이의 차이" 섹션, 그리고 주의 섹션에 있는 6.x 이후의 예약 키워드를 참조하십시오.

호환성 수준 설정 60 또는 65

호환성 수준 설정 70 이상

GROUP BY 절은 있고 ORDER BY 절은 없는 SELECT 문의 결과 집합이 GROUP BY 열별로 정렬됩니다.

GROUP BY 절은 그 자체로 정렬되지 않습니다. 결과 집합을 정렬하려면 SQL Server에 대해 ORDER BY 절을 명시적으로 지정해야 합니다. 자세한 내용은 SELECT(Transact-SQL)를 참조하십시오.

테이블 별칭을 접두사로 사용하는 열이 UPDATE 문의 SET 절에서 허용됩니다.

테이블 별칭이 UPDATE 문의 SET 절에서 허용되지 않습니다. SET 절에 지정된 테이블 또는 뷰는 UPDATE 키워드 바로 다음에 지정된 테이블 또는 뷰와 일치해야 합니다. 자세한 내용은 UPDATE(Transact-SQL)를 참조하십시오.

CREATE TABLE 또는 ALTER TABLE에서 명시적인 NULL 또는 NOT NULL 옵션을 사용하지 않고 만든 bit 열은 NOT NULL로 생성됩니다.

Null 허용 여부가 명시적이지 않은 bit 열의 Null 허용 여부는 SET ANSI_NULL_DFLT_ON/SET ANSI_NULL_DFLT_OFF의 세션 설정이나 SET ANSI NULL DEFAULT의 데이터베이스 설정에 의해 결정됩니다. 자세한 내용은 SET(Transact-SQL)을 참조하십시오.

ALTER COLUMN 절을 ALTER TABLE에서 사용할 수 없습니다.

ALTER COLUMN 절을 ALTER TABLE에서 사용할 수 있습니다. 자세한 내용은 ALTER TABLE(Transact-SQL)을 참조하십시오.

테이블에 대해 생성된 트리거가 같은 유형의 기존 트리거(INSERT, UPDATE, DELETE)를 대체합니다. CREATE TRIGGER의 WITH APPEND 옵션을 사용하여 같은 유형의 트리거를 여러 개 만들 수 있습니다.

같은 유형의 트리거가 추가됩니다. 트리거 이름은 고유해야 합니다. WITH APPEND 옵션으로 간주됩니다. 자세한 내용은 CREATE TRIGGER(Transact-SQL)를 참조하십시오.

일괄 처리 또는 프로시저에 잘못된 개체 이름이 있으면 일괄 처리가 구문 분석되거나 컴파일될 때 경고가 반환되고 일괄 처리가 실행될 때 오류 메시지가 반환됩니다.

잘못된 로컬 개체의 경우에는 일괄 처리가 구문 분석되거나 컴파일될 때 경고가 반환되지 않고 일괄 처리가 실행될 때 오류 메시지가 반환됩니다.

그러나 잘못된 원격 개체의 경우에는 DNR(지연된 이름 확인)이 지원되지 않습니다. 프로시저에서 잘못된 원격 테이블이 사용되는 경우에는 프로시저 생성이 실패하고 오류를 반환합니다.

ms178653.note(ko-kr,SQL.90).gif참고:

DNR 지원(실행될 때까지는 존재하지 않는 개체를 컴파일 시에 참조하는 기능)은 테이블이나 뷰 이름에만 적용됩니다. 지연된 이름 확인에 대한 자세한 내용은 CREATE PROCEDURE(Transact-SQL)를 참조하십시오.

다음과 같은 형식의 쿼리는 Y 테이블를 무시하고 SELECT 문 결과를 X 테이블에 삽입함으로써 제대로 실행됩니다.

INSERT X
SELECT select_list INTO Y

Microsoft SQL Server 7.0 이상에서는 이와 동일한 쿼리를 실행하면 구문 오류가 반환됩니다.

빈 문자열 리터럴(' ')은 공백 하나로 간주됩니다.

빈 문자열 리터럴(' ')은 빈 문자열로 간주됩니다.

DATALENGTH('')는 1을 반환하고 ''는 공백 하나로 구문 분석됩니다.

DATALENGTH(N'')는 2를 반환하고 N''은 유니코드 공백 하나로 구문 분석됩니다.

DATALENGTH('')는 0을 반환합니다.

DATALENGTH(N'')는 0을 반환합니다.

LEFT('123', 0)는 NULL을 반환합니다.

LEFT(N'123', 0)는 NULL을 반환합니다.

LEFT('123', 0)는 빈 문자열을 반환합니다.

LEFT(N'123', 0)는 빈 문자열을 반환합니다.

LTRIM(' ')은 NULL을 반환합니다.

LTRIM(N' ')은 NULL을 반환합니다.

LTRIM(' ')은 빈 문자열을 반환합니다.

LTRIM(N' ')은 빈 문자열을 반환합니다.

REPLICATE('123', 0)는 NULL을 반환합니다.

REPLICATE(N'123', 0)는 NULL을 반환합니다.

REPLICATE('123', 0)는 빈 문자열을 반환합니다.

REPLICATE(N'123', 0)는 빈 문자열을 반환합니다.

RIGHT(N'123', 0)는 NULL을 반환합니다. RIGHT('123', 0)는 NULL을 반환합니다.

RIGHT('123', integer_expression)는 integer_expression이 음수이면 NULL을 반환합니다.

RIGHT(N'123', integer_expression)는 integer_expression이 음수이면 NULL을 반환합니다.

RIGHT('123', 0)는 빈 문자열을 반환합니다.

RIGHT(N'123', 0)는 빈 문자열을 반환합니다.

RIGHT('123', integer_expression)는 integer_expression이 음수이면 오류를 반환합니다. RIGHT(N'123', integer_expression)는 integer_expression이 음수이면 오류를 반환합니다.

RTRIM(' ')은 NULL을 반환합니다.

RTRIM(N' ')은 NULL을 반환합니다.

RTRIM(' ')은 빈 문자열을 반환합니다.

RTRIM(N' ')은 빈 문자열을 반환합니다.

SPACE(0)는 NULL을 반환합니다.

SPACE(0)는 빈 문자열을 반환합니다.

start 값으로 expression의 문자 수보다 큰 값을 지정하거나 length가 0과 같으면*,* SUBSTRING(expression, start, length) 함수에서 NULL을 반환합니다. 예를 들어 SUBSTRING(N'123', 4, 1)은 NULL을 반환합니다.

동일한 조건에서 SUBSTRING(expression, start, length)은 한 쌍의 작은따옴표로 구분된 빈 문자열을 반환합니다. 예를 들어 SUBSTRING(N'123', 4, 1)은 ''를 반환합니다.

UPDATETEXT table.textcolumn textpointer 0 NULL NULL은 Null 값을 반환합니다.

UPDATETEXT table.textcolumn textpointer 0 NULL NULL은 빈 텍스트를 반환합니다.

CHARINDEX와 PATINDEX 함수는 패턴과 식이 모두 NULL인 경우에만 NULL을 반환합니다.

CHARINDEX와 PATINDEX 함수는 모든 입력 매개 변수가 NULL인 경우 NULL을 반환합니다.

inserteddeleted 테이블의 text 또는 image 열에 대한 참조가 NULL로 표시됩니다.

inserteddeleted 테이블의 text 또는 image 열에 대한 참조가 허용되지 않습니다.

한 트리거 내의 inserteddeleted 테이블에서 textimage 열을 가져오면 textimage 열에 대해 NULL 값이 반환됩니다.

한 트리거 내의 inserteddeleted 테이블에서 textimage 열을 가져올 수 없으며 오류가 발생됩니다.

text 열을 NULL로 초기화하는 UPDATETEXT를 허용합니다.

UPDATETEXT는 text 열을 빈 문자열로 초기화합니다.

WRITETEXT는 text 열을 NULL로 초기화합니다.

sp_dboptionconcatenation of null yields null 설정이 off(사용 안 함)이므로 연결 연산의 피연산자가 NULL이면 빈 문자열을 반환합니다.

sp_dboptionconcatenation of null yields null 설정이 on(사용)이므로 연결 연산의 피연산자가 NULL이면 NULL을 반환합니다.

INSERT 문의 VALUES 절에서 스칼라 값을 반환하는 SELECT 문이 허용됩니다.

INSERT 문은 삽입할 값 중 하나로서 VALUES 절에 SELECT 문을 포함할 수 없습니다.

INSERT table EXEC procedure 문에서 참조되는 저장 프로시저의 ROLLBACK 문을 사용하면 INSERT 문은 롤백되지만 일괄 처리는 계속됩니다.

INSERT...EXEC 문에서 참조하는 저장 프로시저의 ROLLBACK 문을 사용하면 전체 트랜잭션이 롤백되고 일괄 처리 실행이 중지됩니다.

낮은 호환성 수준과 수준 90 사이의 차이

다음 하위 섹션에서는 호환성 수준 90으로 정의된 새로운 동작에 대해 설명합니다. 80 이하의 호환성 수준에 영향을 주는 추가적인 동작 차이에 대한 자세한 내용은 이 섹션의 뒷부분에 나오는 "예약 키워드" 섹션을 참조하십시오.

호환성 수준 90에서는 동작이 다음과 같이 변경되었습니다.

호환성 수준 설정 80 이하

호환성 수준 설정 90

영향력

FROM 절의 잠금 힌트에 대해 WITH 키워드는 항상 옵션입니다.

몇 가지 예외가 있지만 테이블 힌트는 WITH 키워드를 사용하여 힌트를 지정할 때만 FROM 절에서 지원됩니다. 자세한 내용은 FROM(Transact-SQL)을 참조하십시오.

높음

외부 조인에 대한 *= and =* 연산자가 지원되지만 경고 메시지가 표시됩니다.

이러한 연산자가 지원되지 않으므로 OUTER JOIN 키워드를 사용해야 합니다.

높음

ORDER BY 목록의 열 참조를 SELECT 목록에 정의된 열로 바인딩할 때 열 모호성이 무시되고 경우에 따라 열 접두사도 무시됩니다. 이로 인해 결과 집합이 예기치 않은 순서로 반환될 수 있습니다.

예를 들어 두 부분으로 이루어진 단일 열(<table_alias>.<column>)로 구성되고 SELECT 목록에서 열 참조로 사용되는 ORDER BY 절은 허용되지만 테이블 별칭은 무시됩니다. 다음 쿼리를 살펴보십시오.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

이 쿼리를 실행하면 열 접두사가 ORDER BY에서 무시됩니다. 정렬 작업은 예상대로 지정한 원본 열(x.c1)에서 수행되지 않고 대신 쿼리에 정의된 파생된 c1 열에서 수행됩니다. 이 쿼리의 실행 계획은 파생된 열의 값이 먼저 계산된 다음 계산된 값이 정렬됨을 보여 줍니다.

열 모호성에서 오류가 발생됩니다. SELECT 목록에 정의된 열로 바인딩할 때 ORDER BY에 지정된 열 접두사는 무시되지 않습니다(있는 경우).

다음 쿼리를 살펴보십시오.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

이 쿼리를 실행하면 ORDER BY 절의 열 접두사가 무시되지 않습니다. 정렬 작업은 예상대로 지정한 원본 열(x.c1)에서 수행됩니다. 이 쿼리의 실행 계획은 SORT 연산자가 t_table에서 반환된 행의 순서를 지정한 다음 SELECT 목록에 정의된 파생된 c1 열의 값이 계산됨을 보여 줍니다.

보통

데이터 형식이 다른 UNION의 INSERT SELECT에서 각 UNION 분기는 INSERT 대상 열의 유형으로 직접 형변환됩니다. 호환되지 않는 유형 변환으로 인해 단독으로 사용되는 UNION이 실패하는 경우에도 UNION의 결과 유형에 대한 분기는 변환되지 않기 때문에 INSERT SELECT를 사용하면 UNION이 제대로 실행됩니다.

SQL Server 2005에서 UNION의 결과 유형은 INSERT SELECT와 별개로 파생됩니다. UNION의 각 분기는 UNION의 결과 유형으로 형변환된 다음 INSERT의 대상 열 유형으로 형변환됩니다. UNION에 호환되지 않는 유형이 있으면 첫 번째 형변환에서 오류가 발생할 수 있습니다. 호환성 수준 90으로 실행하려면 INSERT SELECT 내에서 사용된 호환되지 않는 모든 유형의 UNION을 수정해야 합니다.

보통

뷰 또는 참조된 뷰에서 TOP 절을 사용하는 경우 뷰를 통한 삽입 및 업데이트 작업은 WITH CHECK OPTION 절을 지정하는 뷰에서 제대로 지원되지 않습니다.

뷰 또는 참조된 뷰에서 TOP 절을 사용하는 경우 뷰를 통한 삽입 및 업데이트 작업은 WITH CHECK OPTION을 사용하는 뷰에서 지원되지 않습니다.

보통

가변 길이 열과 고정 길이 열의 UNION에서 고정 길이 열을 생성합니다.

가변 길이 열과 고정 길이 열의 UNION에서 가변 길이 열을 생성합니다.

보통

SET XACT_ABORT OFF가 한 트리거 내에서 허용됩니다.

SET XACT_ABORT OFF가 한 트리거 내에서 허용되지 않습니다.

보통

FOR BROWSE 절이 뷰에서 허용되고 무시됩니다.

FOR BROWSE 절이 뷰에서 허용되지 않습니다.

보통

도메인 오류가 ANSI_WARNINGS에 의해 제어되지 않습니다. ANSI_WARNINGS가 OFF로 설정되어 있고 ARITHABORT가 변경되지 않으면 ARITHABORT 설정이 적합한 값으로 인식됩니다.

도메인 오류는 ANSI_WARNINGS에 의해 제어되며 심각도가 16인 오류입니다. ANSI_WARNINGS나 ARITHABORT가 ON이면 NULL 값을 반환하는 대신 오류가 발생합니다. 이러한 변경으로 인해 OFF로 설정된 ARITHABORT에 종속되어 있는 사용자 스크립트의 연결이 끊어질 수 있습니다.

보통

원격 데이터 원본 [OpenRowset 또는 OpenQuery]에 대한 통과 쿼리가 이름이 중복된 열을 생성하는 경우 해당 열이 쿼리에서 명시적으로 명명되지 않는 한 이 중복된 열 이름은 무시됩니다.

원격 데이터 원본 [OpenRowset 또는 OpenQuery]에 대한 통과 쿼리가 이름이 중복된 열을 생성하면 오류가 발생합니다.

낮음

크기가 8000보다 큰 문자열 상수와 varbinary 상수는 text, ntext 또는 image로 처리됩니다.

크기가 8000보다 큰 문자열 상수와 varbinary 상수는 varchar(max)(또는 각각 nvarchar(max)varbinary(max)) 유형으로 처리됩니다. 따라서 SELECT 목록에 이러한 식이 있으면 SELECT … INTO를 사용하여 만든 테이블의 데이터 형식이 변경될 수 있습니다.

낮음

숫자 유형(smallint, tinyint, int, bigint, numeric, decimal, smallmoney, money) 간 비교는 유형 계층에서 우선 순위가 낮은 피비교수를 우선 순위가 높은 유형으로 변환하여 수행합니다.

변환하지 않고 숫자 유형 값이 비교됩니다. 따라서 성능이 향상됩니다. 그러나 이런 경우 동작이 약간 변경될 수 있습니다. 특히 변환으로 인해 오버플로 예외가 발생하는 경우에는 더욱 그렇습니다.

낮음

4000자를 초과하여 입력하면 문자열 인수를 사용하는 기본 제공 메타데이터 함수에서 입력을 잘라냅니다.

잘라내기로 인해 공백이 아닌 문자가 손실되면 기본 제공 메타데이터 함수에서 오류가 발생합니다.

낮음

따옴표가 없는 식별자에서 허용되지 않는 문자 집합이 변경되지 않고 그대로 유지됩니다.

Transact-SQL 파서는 유니코드 3.2 표준을 지원합니다. 이 표준은 구분 기호로 분리되지 않은 식별자에서 허용되지 않는 일부 국가별 문자에 대한 문자 분류를 변경합니다.

낮음

부동 소수점 도메인 오류[즉, log() 함수의 경우 음수 인수]가 발생하는 경우 SET ANSI_WARNINGS ON 설정은 SET ARITHABORT OFF 설정보다 우선 적용되지 않습니다. ANSI_WARNINGS는 ON이지만 ARITHABORT는 OFF인 경우에는 부동 소수점 도메인 오류로 인해 쿼리가 종료되지 않습니다.

SET ANSI_WARNINGS ON 설정이 ARITHABORT OFF 설정보다 우선 적용됩니다. 이런 경우 부동 소수점 도메인 오류로 인해 쿼리가 종료됩니다.

낮음

정수가 아닌 상수가 ORDER BY 절에서 허용되고 무시됩니다.

정수가 아닌 상수가 ORDER BY 절에서 허용되지 않습니다.

낮음

SET 옵션이 지정되지 않은 빈 SET 문이 허용됩니다.

빈 SET 절이 허용되지 않습니다.

낮음

파생 테이블에서 생성한 열에 대해 IDENTITY 특성이 제대로 파생되지 않습니다.

파생 테이블에서 생성한 열에 대해 IDENTITY 특성이 제대로 파생됩니다.

낮음

부동 소수점 데이터 형식에 대한 산술 연산자의 Null 허용 속성이 항상 Null을 허용합니다.

부동 소수점 데이터 형식에 대한 산술 연산자의 Null 허용 여부 속성은 입력이 Null을 허용하지 않고 ANSI_WARNINGS가 ON인 경우 Null을 허용하지 않음으로 변경됩니다.

낮음

UNION을 사용하는 INSERT .. SELECT 문에서 개별 결과 집합이 생성한 유형은 모두 대상 결과 유형으로 변환됩니다.

UNION을 사용하는 INSERT .. SELECT 문에서 다양한 분기의 지배적인 유형이 결정되고 그 결과는 대상 테이블 유형으로 변환되기 전에 해당 유형으로 변환됩니다.

낮음

SELECT .. FOR XML 문에서 필요 없는 경우에도 16진수(27)(' 문자)와 16진수(22)(")의 형식이 항상 올바르게 수정됩니다.

FOR XML은 필요한 경우에만 16진수(27)와 16진수(22)의 형식을 올바르게 수정합니다. 다음과 같은 경우에는 형식이 올바르게 수정되지 않습니다.

  • 특성 내용에서 16진수(27)(' 문자)는 특성 값이 "로 구분되는 경우에 형식이 올바로 수정되지 않으며 16진수(22)(" 문자)는 특성 값이 **'**로 구분되는 경우 형식이 올바로 수정되지 않습니다.
  • 요소 내용에서는 16진수(27)와 16진수(22)의 형식이 올바로 수정되지 않습니다.

낮음

FOR XML에서는 타임스탬프 값이 정수로 매핑됩니다.

FOR XML에서는 타임스탬프 값이 이진 값으로 매핑됩니다.

자세한 내용은 timestamp 데이터 형식에 대한 FOR XML 지원을 참조하십시오.

높음(timestamp 열이 사용된 경우), 그 외 경우는 낮음

FOR XML 및 OPENXML의 이름에서 3바이트 유니코드 문자는 8개의 위치에 걸쳐 표시됩니다.

예를 들어 8개의 위치에 표시되는 FOR XML은 유니코드 코드 포인트 U+10000을 다음과 같이 표시합니다.

<a_x00010000_ c1="1" />

FOR XML 및 OPENXML의 이름에서 3바이트 유니코드 문자는 6개의 위치에 걸쳐 표시됩니다.

예를 들어 6개의 위치에 표시되는 FOR XML은 유니코드 코드 포인트 U+10000을 다음과 같이 표시합니다.

<a_x010000_ c1="1" />

낮음

FOR XML에서 AUTO 모드의 파생 테이블 매핑은 투명하게 처리됩니다.

예를 들면 다음과 같습니다.

USE AdventureWorks
CREATE TABLE Test(id int);
INSERT INTO Test VALUES(1);
INSERT INTO Test VALUES(2);
SELECT * FROM (SELECT a.id AS a, 
b.id AS b FROM Test a 
JOIN Test b ON a.id=b.id) 
Test FOR XML AUTO;

AdventureWorks의 호환성 수준을 80으로 설정하면 위 예에서는 다음이 생성됩니다.

<a a="1"><b b="1"/></a>

<a a="2"><b b="2"/></a>

FOR XML에서 AUTO 모드의 파생 테이블 매핑은 불투명하게 처리됩니다.

AdventureWorks의 호환성 수준을 90으로 설정하면 앞의 예에서는 다음이 생성됩니다.

<Test a="1" b="1"/>

<Test a="2" b="2"/>

AUTO 모드로 변경하는 방법은 AUTO 모드의 향상된 기능을 참조하십시오.

높음(FOR XML AUTO 모드가 뷰에 적용된 경우), 그 외 경우는 낮음

money로 변환되는 문자열은 한국어와 일본어에서만 백슬래시 문자(\)를 통화 기호로 사용하도록 지원합니다.

백슬래시 문자(\)가 모든 언어에서 money로 변환되는 모든 문자열에 허용됩니다. ISNUMERIC은 \가 통화 기호로 사용되는 경우에 true를 반환합니다.

SQL Server 2005 이전 버전의 SQL Server에 있는 데이터베이스의 경우 이 새 기능은 한국어나 일본어가 아닌 경우에도 \를 포함하는 ISNUMERIC 반환 값에 종속되는 인덱스와 계산 열을 구분합니다.

낮음

피연산자가 Null을 허용하지 않고 ANSI_WARNINGS나 ARITHABORT가 ON으로 설정된 경우에도 산술 연산자의 결과는 항상 Null을 허용합니다.

ANSI_WARNINGS나 ARITHABORT가 ON으로 설정되어 있는 경우 두 피연산자가 Null을 허용하지 않으면 부동 소수점 산술 연산자의 결과는 Null을 허용하지 않습니다.

Null 허용 여부를 이렇게 변경하면 bcp를 사용하여 부동 소수점 산술 연산자를 사용하는 계산 열이 있는 SQL Server 2000 테이블에서 이진 형식을 사용하는 데이터를 대량으로 내보낸 다음 bcp나 BULK INSERT를 사용하여 정의가 동일한 SQL Server 2005 테이블로 해당 데이터를 대량으로 가져오는 경우 오류가 발생할 수 있습니다.

ms178653.note(ko-kr,SQL.90).gif참고:

두 옵션 모두 OFF로 설정되어 있으면 데이터베이스 엔진은 결과를 Null 허용으로 표시합니다. 이 동작은 SQL Server 2000과 같습니다.

낮음

매개 변수로 nvarchar를 사용하는 기본 제공 함수의 경우 제공된 값이 varchar이면 그 값은 nvarchar(4000)로 변환됩니다. SQL Server 2000에서 더 큰 값이 전달되면 자동으로 잘립니다.

매개 변수로 nvarchar를 사용하는 기본 제공 함수의 경우 제공된 값이 varchar이면 그 값은 nvarchar(4000)로 변환됩니다. 그러나 더 큰 값이 전달되면 SQL Server 2005에서 오류가 발생합니다.

호환성 수준 90으로 실행하려면 잘림 기능을 사용하는 모든 사용자 지정 코드를 수정해야 합니다.

낮음

가변 길이(varchar, varbinary, nvarchar) 문자열과 고정 길이(char, binary 또는 nchar) 문자열의 UNION은 고정 길이 결과를 반환합니다.

가변 크기 문자열과 고정 크기 문자열의 UNION은 가변 크기 문자열을 반환합니다.

호환성 수준 90으로 실행하려면 가변 크기 유형과 고정 크기 유형의 UNION에서 발생하는 유형에 종속된 모든 위치(인덱스, 쿼리 및 계산 열)를 수정해야 합니다.

낮음

0xFFFF 문자를 포함하는 개체 이름은 올바른 식별자입니다.

0xFFFF 문자를 포함하는 개체 이름은 잘못된 식별자이며 액세스할 수 없습니다.

호환성 수준 90으로 실행하려면 이 문자를 포함하는 개체의 이름을 변경해야 합니다.

낮음

SELECT ISNUMERIC('<string>')에서 <string> 내에 포함된 쉼표는 의미가 있습니다.

예를 들어 다음 SELECT ISNUMERIC('121212,12') 쿼리에서는 0을 반환하며 이는 문자열 121212,12가 숫자가 아님을 나타냅니다.

SELECT ISNUMERIC('<string>')에서 <string> 내에 포함된 쉼표는 무시됩니다.

예를 들어 다음 SELECT ISNUMERIC('121212,12') 쿼리에서는 1을 반환하며 이는 문자열 121212,12가 숫자임을 나타냅니다.

낮음

Transact-SQL 문에서 예약 키워드 뒤에 나오는 콜론(:)은 무시됩니다.

Transact-SQL 문에서 예약 키워드 뒤에 콜론(:)이 있으면 문이 실패합니다.

낮음

외부 쿼리의 열을 참조하는 하위 쿼리의 GROUP BY 절이 성공합니다.

외부 쿼리의 열을 참조하는 하위 쿼리의 GROUP BY 절이 SQL 표준에 따라 오류를 반환합니다.

낮음

예약 키워드

호환성 설정은 데이터베이스 엔진에 예약되어 있는 키워드도 결정합니다. 다음 표에서는 각 호환성 수준에 의해 정의된 예약 키워드를 보여 줍니다.

호환성 수준 설정 예약 키워드

90

EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE

80

COLLATE, FUNCTION, OPENXML

70

BACKUP, CONTAINS, CONTAINSTABLE, DENY, FREETEXT, FREETEXTTABLE, PERCENT, RESTORE, ROWGUIDCOL, TOP

65

AUTHORIZATION, CASCADE, CROSS, DISTRIBUTED, ESCAPE, FULL, INNER, JOIN, LEFT, OUTER, PRIVILEGES, RESTRICT, RIGHT, SCHEMA, WORK

지정된 호환성 수준의 예약 키워드에는 해당 수준 또는 그 아래 수준에서 정의된 모든 키워드가 포함됩니다. 따라서 수준이 90인 응용 프로그램의 경우에는 위 표에 나열된 모든 키워드가 예약되어 있습니다. 더 낮은 호환성 수준에서 수준이 90인 키워드는 유효한 개체 이름으로 유지되지만 해당 키워드에 대한 수준이 90인 언어 기능은 사용할 수 없습니다.

정의된 키워드는 예약된 상태로 유지됩니다. 예를 들어 호환성 수준 70에서 정의된 예약 키워드 BACKUP은 수준 80과 90에서도 예약되어 있습니다.

응용 프로그램이 호환성 수준에 대한 키워드로 예약되어 있는 식별자를 사용할 경우 제대로 실행되지 않습니다. 이러한 문제를 해결하려면 식별자를 대괄호([])나 따옴표("")로 묶으십시오. 예를 들어 EXTERNAL 식별자를 사용하는 응용 프로그램을 호환성 수준 90으로 업그레이드하려면 식별자를 **[EXTERNAL]**이나 **"EXTERNAL"**로 변경할 수 있습니다.

사용 권한

데이터베이스 소유자, sysadmin 고정 서버 역할 및 db_owner 고정 데이터베이스 역할(현재 데이터베이스를 변경하려는 경우)의 멤버만 이 프로시저를 실행할 수 있습니다.

1. SQL Server 2000으로 호환성 수준 변경

다음 예에서는 AdventureWorks 데이터베이스의 호환성 수준을 80으로 변경합니다.

EXEC sp_dbcmptlevel AdventureWorks, 80;
GO

2. ORDER BY에 호환성 수준이 미치는 결과(시나리오 1)

다음 예에서는 호환성 수준 80과 90에서 ORDER BY 바인딩의 차이를 보여 줍니다. 이 예에서는 tempdb 데이터베이스에 SampleTable 예제 테이블을 만듭니다.

USE tempdb;
CREATE TABLE SampleTable(c1 int, c2 int);
GO

기본 수준인 호환성 수준 90에서 다음 SELECT... ORDER BY 문은 AS 절의 열 이름인 c1이 모호하기 때문에 오류를 생성합니다.

SELECT c1, c2 AS c1
    FROM SampleTable
    ORDER BY c1;
GO

데이터베이스를 호환성 수준 80으로 다시 설정하면 동일한 SELECT... ORDER BY 문이 제대로 실행됩니다.

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c1
    FROM SampleTable
    ORDER BY c1;
GO

다음 SELECT... ORDER BY 문은 두 호환성 수준에서 모두 실행됩니다.

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

sp_dbcmptlevel tempdb, 90
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

3. ORDER BY에 호환성 수준이 미치는 결과(시나리오 2)

기본 수준인 호환성 수준 90에서 다음 SELECT...ORDER BY 문은 ORDER BY 절에 추가 테이블 접두사가 있기 때문에 오류를 생성합니다.

SELECT c1 AS x
    FROM SampleTable
    ORDER BY SampleTable.x;
GO

데이터베이스를 호환성 수준 80으로 다시 설정하면 동일한 SELECT...ORDER BY 문이 제대로 실행됩니다.

sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
    FROM SampleTable
    ORDER BY SampleTable.x;
GO

다음 SELECT...ORDER BY 문은 두 호환성 수준에서 모두 실행됩니다.

sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
    FROM SampleTable
    ORDER BY x;
GO
sp_dbcmptlevel tempdb, 90
SELECT c1 AS x
    FROM SampleTable
    ORDER BY x;
GO

참고 항목

참조

데이터베이스 엔진 저장 프로시저(Transact-SQL)
ALTER DATABASE(Transact-SQL)
ALTER TABLE(Transact-SQL)
CREATE PROCEDURE(Transact-SQL)
CREATE TRIGGER(Transact-SQL)
EXECUTE(Transact-SQL)
예약된 키워드(Transact-SQL)
SELECT(Transact-SQL)
SET(Transact-SQL)
시스템 저장 프로시저(Transact-SQL)
UPDATE(Transact-SQL)

관련 자료

데이터베이스 호환성 수준 옵션
새 FOR XML 기능
데이터베이스 옵션 설정
SQL Server에서 옵션 사용

도움말 및 정보

SQL Server 2005 지원 받기

변경 내역

릴리스 내역

2006년 7월 17일

업데이트된 내용
  • "master 데이터베이스의 호환성 수준은 수정할 수 없습니다."라는 설명을 제거했습니다.

2006년 4월 14일

새로운 내용
  • "최상의 방법" 섹션을 추가했습니다.
  • 하위 쿼리의 GROUP BY 동작에 대한 텍스트를 추가했습니다.