ALTER DATABASE 호환성 수준(Transact-SQL)

특정 데이터베이스 동작이 지정된 버전의 SQL Server와 호환되도록 설정합니다. 다음 ALTER DATABASE 구문은 sp_dbcmptlevel 프로시저를 대신하여 데이터베이스 호환성 수준을 설정하는 데 사용됩니다. 다른 ALTER DATABASE 옵션을 보려면 ALTER DATABASE(Transact-SQL)를 참조하십시오.

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

구문

ALTER DATABASE database_name 
SET COMPATIBILITY_LEVEL = { 80 | 90 | 100 }

인수

  • database_name
    수정할 데이터베이스의 이름입니다.

  • COMPATIBILITY_LEVEL { 80 | 90 | 100 }
    데이터베이스가 호환되도록 설정할 SQL Server의 버전입니다. 값은 다음 중 하나여야 합니다.

    80 = SQL Server 2000 

    90 = SQL Server 2005 

    100 = SQL Server 2008 

주의

모든 SQL Server 2008 설치에서 기본 호환성 수준은 100입니다. SQL Server 2008에서 만든 데이터베이스는 model 데이터베이스의 호환성 수준이 이보다 낮지 않은 한 이 수준으로 설정됩니다. 이전 버전의 SQL Server 데이터베이스를 SQL Server 2008로 업그레이드할 때 데이터베이스의 호환성 수준이 80 이상이면 기존 수준이 유지됩니다. 호환성 수준이 80 미만인 데이터베이스를 업그레이드하면 데이터베이스 호환성 수준이 80으로 설정됩니다. 이는 시스템 및 사용자 데이터베이스 모두에 적용됩니다. 데이터베이스의 호환성 수준을 변경하려면 ALTER DATABASE를 사용합니다. 현재 데이터베이스 호환성 수준을 보려면 sys.databases 카탈로그 뷰의 compatibility_level 열을 쿼리합니다.

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

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

최선의 구현 방법

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

  1. ALTER DATABASE SET SINGLE_USER를 사용하여 데이터베이스를 단일 사용자 액세스 모드로 설정합니다.

  2. 데이터베이스의 호환성 수준을 변경합니다.

  3. ALTER DATABASE SET MULTI_USER를 사용하여 데이터베이스를 다중 사용자 액세스 모드로 설정합니다.

  4. 데이터베이스의 액세스 모드를 설정하는 방법은 ALTER DATABASE(Transact-SQL)를 참조하십시오.

SET 옵션

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

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

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

호환성 수준 80과 수준 100 사이의 차이

이 섹션에서는 호환성 수준 90으로 정의된 새로운 동작에 대해 설명합니다.

호환성 수준 90에서는 다음과 같은 동작 차이가 발생합니다.

호환성 수준 설정 80

호환성 수준 설정 90

영향력

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

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

High

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

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

High

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의 값이 계산됨을 보여 줍니다. 이 경우 결과 순서가 SQL Server 2000에서 반환되는 결과와 서로 다를 수 있습니다. SQL Server 2000과 동일한 순서의 결과를 얻으려면 ORDER BY 절의 열 접두사를 제거합니다.

Medium

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

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

Medium

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

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

Medium

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

char 및 varchar 값이 포함되어 있는 경우 CASE 식이 고정 길이(char) 유형을 반환합니다.

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

char 및 varchar 값이 포함되어 있는 경우 CASE 식이 가변 길이(varchar) 유형을 반환합니다.

Medium

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

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

Medium

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

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

Medium

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

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

Medium

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

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

Low

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

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

Low

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

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

Low

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

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

Low

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

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

Low

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

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

Low

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

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

Low

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

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

Low

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

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

Low

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

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

Low

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

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

Low

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

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

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

  • 요소 내용에서는 16진수(27)와 16진수(22)의 형식이 올바로 수정되지 않습니다.

Low

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

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

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

High(timestamp 열이 사용된 경우), 그 외의 경우는 Low

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" />

Low

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

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

USE AdventureWorks2008R2;
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;

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

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

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

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

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

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

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

High(FOR XML AUTO 모드가 뷰에 적용된 경우), 그 외 경우는 Low

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

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

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

Low

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

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

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

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

Low

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

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

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

Low

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

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

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

Low

0xFFFF 문자를 포함하는 개체 이름은 잘못된 식별자입니다.

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

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

Low

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

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

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

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

Low

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

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

Low

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

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

Low

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

이 섹션에서는 호환성 수준 100으로 정의된 새로운 동작에 대해 설명합니다.

호환성 수준 설정 90 이하

호환성 수준 설정 100

영향력

세션 수준 설정과 상관없이 다중 문 테이블 반환 함수를 만든 경우 이 함수에 대해 QUOTED_IDENTIFER 설정은 항상 ON으로 설정됩니다.

다중 문 테이블 반환 함수를 만든 경우 QUOTED IDENTIFIER 세션 설정이 적용됩니다.

Medium

파티션 함수를 만들거나 바꾸면 언어 설정을 US_English로 가정하고 함수의 datetime 및 smalldatetime 리터럴을 평가합니다.

현재 언어 설정은 파티션 함수에서 datetime 및 smalldatetime 리터럴을 평가하는 데 사용됩니다.

Medium

FOR BROWSE 절은 INSERT 및 SELECT INTO 문에서 허용되거나 무시됩니다.

FOR BROWSE 절은 INSERT 및 SELECT INTO 문에서 허용되지 않습니다.

Medium

전체 텍스트 조건자는 OUTPUT 절에서 허용됩니다.

전체 텍스트 조건자는 OUTPUT 절에서 허용되지 않습니다.

Low

CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST 및 DROP FULLTEXT STOPLIST는 지원되지 않습니다. 시스템 중지 목록은 자동으로 새로운 전체 텍스트 인덱스와 연결됩니다.

CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST 및 DROP FULLTEXT STOPLIST는 지원됩니다.

Low

MERGE는 예약 키워드가 아닙니다.

MERGE는 완전 예약 키워드입니다. MERGE 문은 호환성 수준 100 및 90 모두에서 지원됩니다.

Low

INSERT 문에서 <dml_table_source> 인수를 사용하면 구문 오류가 발생합니다.

중첩된 INSERT, UPDATE, DELETE 또는 MERGE 문에서 OUTPUT 절의 결과를 캡처하고 그 결과를 대상 테이블이나 뷰에 삽입할 수 있습니다. 이 작업은 INSERT 문의 <dml_table_source> 인수를 사용하여 수행됩니다.

Low

NOINDEX가 지정되지 않으면 DBCC CHECKDB 또는 DBCC CHECKTABLE은 단일 테이블이나 인덱싱된 뷰 및 해당하는 모든 비클러스터형 XML 인덱스에 대해 물리적 일관성 검사와 논리적 일관성 검사를 모두 수행합니다. 공간 인덱스는 지원되지 않습니다.

NOINDEX가 지정되지 않으면 DBCC CHECKDB 또는 DBCC CHECKTABLE은 단일 테이블 및 해당하는 모든 비클러스터형 인덱스에 대해 물리적 일관성 검사와 논리적 일관성 검사를 모두 수행합니다. 그러나 XML 인덱스, 공간 인덱스 및 인덱싱된 뷰에 대해서는 기본적으로 물리적 일관성 검사만 수행됩니다.

WITH EXTENDED_LOGICAL_CHECKS를 지정하면 인덱싱된 뷰, XML 인덱스 및 공간 인덱스에 대해 논리적 검사가 수행됩니다. 기본적으로 물리적 일관성 검사는 논리적 일관성 검사 전에 수행됩니다. NOINDEX도 지정할 경우 논리적 검사만 수행됩니다.

Low

DML(데이터 조작 언어)로 OUTPUT 절을 사용하는 경우 문 실행 중에 런타임 오류가 발생하면 전체 트랜잭션이 종료되고 롤백됩니다.

DML(데이터 조작 언어)로 OUTPUT 절을 사용하는 경우 문 실행 중에 런타임 오류가 발생하면 SET XACT_ABORT 설정에 따라 동작이 결정됩니다. SET XACT_ABORT가 OFF로 설정된 경우 OUTPUT 절을 사용하는 DML 문에서 문 중단 오류가 발생하면 해당 문은 종료되지만 일괄 처리의 실행이 계속되고 트랜잭션이 롤백되지 않습니다. SET XACT_ABORT가 ON으로 설정된 경우 OUTPUT 절을 사용하는 DML 문에서 런타임 오류가 발생하면 항상 일괄 처리가 종료되고 트랜잭션이 롤백됩니다.

Low

CUBE 및 ROLLUP은 예약 키워드가 아닙니다.

CUBE 및 ROLLUP은 GROUP BY 절에서 예약 키워드입니다.

Low

XML anyType 형식의 요소에는 엄격한 유효성 검사가 적용됩니다.

anyType 형식의 요소에는 엄격하지 않은 유효성 검사가 적용됩니다. 자세한 내용은 와일드카드 구성 요소 및 콘텐츠 유효성 검사를 참조하십시오.

Low

특수 특성 xsi:nilxsi:type은 데이터 조작 언어 문으로 쿼리하거나 수정할 수 없습니다.

즉, /e/@*에서 xsi:nil 및 xsi:type 특성을 무시하고 /e/@xsi:nil이 실패합니다. 그러나 xsi:nil = "false"인 경우에도SELECT xmlCol과의 일관성을 위해 /e에서 xsi:nil 및 xsi:type 특성을 반환합니다.

특수 특성 xsi:nilxsi:type은 일반 특성으로 저장되므로 쿼리 및 수정이 가능합니다.

예를 들어 쿼리 SELECT x.query('a/b/@*')를 실행하면 xsi:nilxsi:type을 포함하는 모든 특성이 반환됩니다. 쿼리에서 이러한 유형을 제외하려면 @*를 @*[namespace-uri(.) != "insert xsi namespace uri"로 바꿉니다. (local-name(.) = "type" 또는 local-name(.) ="nil".로는 바꾸지 마십시오.

Low

XML 상수 문자열 값을 SQL Server datetime 형식으로 변환하는 사용자 정의 함수를 결정적 함수로 표시합니다.

XML 상수 문자열 값을 SQL Server datetime 형식으로 변환하는 사용자 정의 함수를 비결정적 함수로 표시합니다. 

Low

XML union 및 list 형식 중 일부는 지원되지 않습니다.

다음 기능을 포함하여 union 및 list 형식은 모두 지원됩니다.

  • 목록의 합집합

  • 합집합의 합집합

  • 원자성 유형의 목록

  • 합집합의 목록

Low

인라인 테이블 반환 함수 또는 뷰에 xQuery 메서드가 포함된 경우 이 메서드에 필요한 SET 옵션의 유효성을 검사하지 않습니다.

인라인 테이블 반환 함수 또는 뷰에 xQuery 메서드가 포함된 경우 이 메서드에 필요한 SET 옵션의 유효성을 검사합니다. 메서드의 SET 옵션을 잘못 설정하면 오류가 발생합니다.

필수 옵션에 대한 자세한 내용은 옵션 설정(XML 데이터 형식)을 참조하십시오.

Low

줄 끝 문자(캐리지 리턴 및 줄 바꿈)를 포함하는 XML 특성 값은 XML 표준에 따라 정규화되지 않습니다. 즉, 하나의 줄 바꿈 문자 대신 두 문자 모두 반환됩니다.

줄 끝 문자(캐리지 리턴 및 줄 바꿈)를 포함하는 XML 특성 값은 XML 표준에 따라 정규화됩니다. 즉, 문서 엔터티를 포함하여 구문 분석된 외부 엔터티의 모든 줄 바꿈은 2자 시퀀스 #xD #xA 및 뒤에 #xA가 오지 않는 #xD 모두를 하나의 #xA 문자로 변환하여 입력에서 정규화됩니다.

특성을 사용하여 줄 끝 문자를 포함하는 문자열 값을 변환하는 응용 프로그램은 이러한 제출된 문자를 다시 수신하지 않습니다. 정규화 프로세스를 방지하려면 XML 숫자 문자 엔터티를 사용하여 모든 줄 끝 문자를 인코딩합니다.

Low

열 속성 ROWGUIDCOL 및 IDENTITY는 제약 조건으로 잘못 이름이 지정될 수 있습니다. 예를 들어 CREATE TABLE T (C1 int CONSTRAINT MyConstraint IDENTITY) 문은 실행되긴 하지만 제약 조건 이름이 보존되지 않으며 이를 통해 사용자에게 액세스할 수 없습니다.

열 속성 ROWGUIDCOL 및 IDENTITY는 제약 조건으로 이름을 지정할 수 없습니다. 오류 156이 반환됩니다.

Low

UPDATE T1 SET @v = column_name = <expression>과 같은 양방향 할당을 사용하여 열을 업데이트하면 문 실행 중에 WHERE 및 ON 절과 같은 다른 절에서 문의 시작 값 대신 변수의 현재 값을 사용할 수 있으므로 예상치 못한 결과가 발생할 수 있습니다. 그 결과 각 행에서 조건자의 의미가 예기치 않게 변경될 수 있습니다.

이 동작은 호환성 수준이 90으로 설정된 경우에만 발생합니다.

양방향 할당을 사용하여 열을 업데이트하면 문 실행 중에 열의 문 시작 값만 액세스되므로 예상대로 결과가 나타납니다.

Low

최상위 UNION 연산자가 포함된 문에 변수를 할당할 수 있지만 예상치 않은 결과가 반환됩니다. 예를 들어 다음 문에서 지역 변수 @v에는 두 테이블의 합집합의 열 EmployeeID 값이 할당됩니다. 원래 SELECT 문에서 둘 이상의 값을 반환하면 반환된 값 중 마지막 값이 변수에 할당됩니다. 이 경우 변수에 마지막 값이 올바르게 할당되지만 SELECT UNION 문의 결과 집합도 함께 반환됩니다.

ALTER DATABASE AdventureWorks2008R2
SET compatibility_level = 90;
GO
USE AdventureWorks2008R2;
GO
DECLARE @v int;
SELECT @v = EmployeeID FROM HumanResources.Employee
UNION ALL
SELECT @v = EmployeeID FROM HumanResources.EmployeeAddress;
SELECT @v;

최상위 UNION 연산자가 포함된 문에는 변수를 할당할 수 없습니다. 오류 10734이 반환됩니다.

오류를 해결하려면 다음 예와 같이 쿼리를 다시 작성합니다.

DECLARE @v int;
SELECT @v = EmployeeID FROM 
    (SELECT EmployeeID FROM HumanResources.Employee
     UNION ALL
     SELECT EmployeeID FROM HumanResources.EmployeeAddress) AS Test
SELECT @v;

Low

ODBC 함수 {fn CONVERT()}는 언어의 기본 날짜 형식을 사용합니다. 일부 언어에서 기본 형식은 YDM입니다. 이 경우 CONVERT()가 YMD 형식을 사용하는 {fn CURDATE()}와 같은 다른 함수와 결합되면 변환 오류가 발생합니다.

ODBC 함수 {fn CONVERT()}는 ODBC 데이터 형식 SQL_TIMESTAMP, SQL_DATE, SQL_TIME, SQLDATE, SQL_TYPE_TIME 및 SQL_TYPE_TIMESTAMP로 변환할 때 스타일 121(언어와 상관없는 YMD 형식)을 사용합니다.

Low

ODBC 함수 {fn CURDATE()}는 날짜 형식(예: 'YYYY-MM-DD')만 반환합니다.

ODBC 함수 {fn CURDATE()}는 날짜 및 시간 형식(예: 'YYYY-MM-DD hh:mm:ss) 모두를 반환합니다.

Low

DATEPART와 같은 datetime 내장 함수에서 문자열 입력 값은 유효한 datetime 리터럴이 아니어도 됩니다. 예를 들어SELECT DATEPART(year, '2007/05-30')도 성공적으로 컴파일됩니다.

DATEPART와 같은 datetime 내장 함수에서 문자열 입력 값은 유효한 datetime 리터럴이어야 합니다. 유효하지 않은 datetime 리터럴을 사용하면 오류 241이 반환됩니다.

Low

예약된 키워드

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

호환성 수준 설정

예약된 키워드

100

CUBE, MERGE, ROLLUP

90

EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE

80

COLLATE, FUNCTION, OPENXML

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

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

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

자세한 내용은 예약된 키워드(Transact-SQL)를 참조하십시오.

사용 권한

데이터베이스에 대한 ALTER 권한이 필요합니다.

1. 호환성 수준 변경

다음 예에서는 AdventureWorks2008R2 데이터베이스의 호환성 수준을 90, SQL Server 2005로 변경합니다.

ALTER DATABASE AdventureWorks2008R2
SET COMPATIBILITY_LEVEL = 90;
GO

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

다음 예에서는 호환성 수준 80과 100에서 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 문이 제대로 실행됩니다.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1, c2 AS c1
FROM SampleTable
ORDER BY c1;
GO

AS 절에 모호한 별칭이 지정되었으므로 다음 SELECT... ORDER BY 문은 두 호환성 수준에서 모두 사용할 수 있습니다.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 100;
GO
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
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 문이 제대로 실행됩니다.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1 AS x
FROM SampleTable
ORDER BY SampleTable.x;
GO

ORDER BY 절에 지정된 열 별칭에서 테이블 접두사가 제거되었으므로 다음 SELECT...ORDER BY 문은 두 호환성 수준에서 모두 사용할 수 있습니다.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 100;
GO
SELECT c1 AS x
FROM SampleTable
ORDER BY x;
GO
ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1 AS x
FROM SampleTable
ORDER BY x;
GO