Laboratory/MSSQL

sp_dbcmptlevel(Transact-SQL)

theking 2008. 3. 21. 19:53

 

 

sp_dbcmptlevel(Transact-SQL)

 

 

 

특정 데이터베이스 동작이 지정된 이전 버전의 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는 더 이상 사용되지 않으며 후속 릴리스에서 제거될 예정입니다.

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

사용자 삽입 이미지
주의

데이터베이스가 이전 버전의 SQL Server 에서 SQL Server 2005 로 업그레이드되면 데이터베이스는 기존 호환성 수준을 유지합니다.

SQL Server 2005 의 모든 설치에서 기본 호환성 수준은 90입니다.master데이터베이스의 호환성 수준은 수정할 수 없습니다. 그러나model데이터베이스의 호환성 수준 설정은 변경할 수 있습니다. 이렇게 하면 기본값이 아닌 호환성 수준으로 새 데이터베이스를 만들 수 있습니다. 인덱싱된 뷰를 포함하는 데이터베이스는 80보다 낮은 호환성 수준으로 변경할 수 없습니다.

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

SET 옵션

새 기능이 이전 호환성 수준에서 작동하려면 SET 옵션을 조정해야 합니다. 예를 들어 호환성 수준 80에서xml데이터 형식을 사용하려면 ANSI SET 옵션을 적절하게 설정해야 합니다. 자세한 내용은결과에 영향을 주는 SET 옵션을 참조하십시오.

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

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

sp_dbcmptlevel 사용 시 환경 고려 사항

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

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

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

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

사용자 삽입 이미지
참고:
6.x응용 프로그램에 영향을 주는 추가적인 동작 차이에 대해서는 "이전 호환성 수준과 수준 90 간 동작 차이"의 뒤에 나오는 호환성 수준 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(지연된 이름 확인)이 지원되지 않습니다. 프로시저에서 잘못된 원격 테이블이 사용되는 경우에는 프로시저 생성이 실패하고 오류를 반환합니다.

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

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

INSERT XSELECT 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)은 ''를 반환합니다.

UPDATETEXTtable.textcolumn textpointer0 NULL NULL은 null 값을 반환합니다.

UPDATETEXTtable.textcolumn textpointer0 NULL NULL은 빈 텍스트를 반환합니다.

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

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

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

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

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 문을 포함할 수 없습니다.

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

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

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

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

이전 호환성 수준과 수준 90 간 동작 차이

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

호환성 수준 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 x ORDER BY x.c1쿼리에서ORDER BY작업은 지정한 원본 열(x.c1)에서 수행되지 않고 대신 쿼리에 정의된c1열에서 수행됩니다.

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

보통

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

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

보통

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

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

보통

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

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

보통

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

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

보통

원격 데이터 원본 [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 AdventureWorksCREATE 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 테이블로 해당 데이터를 대량으로 가져오는 경우 오류가 발생할 수 있습니다.

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

낮음

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

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

보통

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

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

보통

매개 변수로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 문에서 예약 키워드 뒤에 콜론(:)이 있으면 문이 실패합니다.

낮음

예약 키워드

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

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

90

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에서도 예약되어 있습니다.

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

사용자 삽입 이미지
반환 코드 값

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

사용자 삽입 이미지
결과 집합

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

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

사용자 삽입 이미지
사용 권한

데이터베이스 소유자,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, 80SELECT c1, c2 AS c1    FROM SampleTable    ORDER BY c1;GO

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

sp_dbcmptlevel tempdb, 80SELECT c1, c2 AS c3FROM SampleTableORDER BY c1;GOsp_dbcmptlevel tempdb, 90SELECT c1, c2 AS c3FROM SampleTableORDER 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, 80SELECT c1 AS x    FROM SampleTable    ORDER BY SampleTable.x;GO

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

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


 

Navigation

sp_dbcmptlevel(Transact-SQL)