SQL Server 2012 데이터베이스 엔진 기능의 동작 변경 내용

이 항목에서는 데이터베이스 엔진의 동작 변경 내용에 대해 설명합니다. 동작 변경 내용은 이전 버전의 SQL Server와 비교해서 SQL Server 2012의 기능이 작동하고 상호 작용하는 방법에 영향을 줍니다.

메타데이터 검색

SQL Server 2012부터 데이터베이스 엔진의 기능이 향상되어 SQLDescribeCol을 통해 SQL Server 이전 버전의 SQLDescribeCol보다 예상 결과에 대한 보다 정확한 설명을 얻을 수 있습니다. 자세한 내용은 메타데이터 검색을 참조하십시오.

쿼리를 실제로 실행하지 않고 응답 형식을 확인하는 SET FMTONLY 옵션이 sp_describe_first_result_set(Transact-SQL), sp_describe_undeclared_parameters(Transact-SQL), sys.dm_exec_describe_first_result_set(Transact-SQL)sys.dm_exec_describe_first_result_set_for_object(Transact-SQL)로 바뀌었습니다.

SQL Server 에이전트 태스크의 스크립팅 동작 변경 내용

SQL Server 2012에서 기존 작업의 스크립트를 복사하여 새 작업을 만드는 경우 해당하는 새 작업은 기존 작업에 영향을 줄 수 있습니다. 기존 작업 스크립트를 사용하여 새 작업을 만들려면 주로 기존 작업에서 작업 스케줄을 만드는 섹션의 마지막 매개 변수인 @schedule\_uid를 수동으로 삭제하십시오. 이렇게 하면 기존 작업에 영향을 주지 않고 새 작업의 독립적인 새 스케줄을 만들 수 있습니다.

CLR 사용자 정의 함수 및 메서드를 위한 상수 폴딩

이제 SQL Server 2012에서는 다음 사용자 정의 CLR 개체를 폴딩할 수 있습니다.

  • 결정적 스칼라 반환 CLR 사용자 정의 함수

  • CLR 사용자 정의 형식의 결정적 메서드

이러한 개선 사항은 동일한 인수를 사용하여 이러한 함수 또는 메서드를 두 번 이상 호출할 때 성능을 향상시키기 위한 것입니다. 그러나 오류에서 비결정적 함수 또는 메서드가 결정적으로 표시된 경우에는 이러한 변경으로 인해 예기치 않은 결과가 발생할 수 있습니다. CLR 함수 또는 메서드의 결정성은 SqlFunctionAttribute 또는 SqlMethodAttribute의 IsDeterministic 속성 값으로 표시됩니다.

빈 공간 형식을 사용하는 STEnvelope() 메서드의 동작이 변경됨

이제 빈 개체를 사용하는 STEnvelope 메서드의 동작이 다른 SQL Server 공간 메서드의 동작과 일치합니다.

SQL Server 2008에서는 빈 개체를 사용하여 호출하는 경우 STEnvelope 메서드에서 다음과 같은 결과를 반환했습니다.

select geometry::Parse('POINT EMPTY').STEnvelope().ToString()
-- returns POINT EMPTY
select geometry::Parse('LINESTRING EMPTY').STEnvelope().ToString()
-- returns LINESTRING EMPTY
select geometry::Parse('POLYGON EMPTY').STEnvelope().ToString()
-- returns POLYGON EMPTY

이제 SQL Server 2012에서는 빈 개체를 사용하여 호출하는 경우 STEnvelope 메서드에서 다음과 같은 결과를 반환합니다.

select geometry::Parse('POINT EMPTY').STEnvelope().ToString()
-- returns GEOMETRYCOLLECTION EMPTY
select geometry::Parse('LINESTRING EMPTY').STEnvelope().ToString()
-- returns GEOMETRYCOLLECTION EMPTY
select geometry::Parse('POLYGON EMPTY').STEnvelope().ToString()
-- returns GEOMETRYCOLLECTION EMPTY

공간 개체가 비어 있는지 여부를 확인하려면 STIsEmpty(geometry 데이터 형식) 메서드를 호출합니다.

로그 함수에 새로운 선택적 매개 변수 포함

이제 LOG 함수에 선택적 base 매개 변수가 있습니다. 자세한 내용은 LOG(Transact-SQL)를 참조하십시오.

분할된 인덱스 작업 중의 통계 계산이 변경됨

SQL Server 2012에서는 분할된 인덱스를 만들거나 다시 작성할 때 테이블의 모든 행을 검색하여 통계를 작성하지 않습니다. 대신 쿼리 최적화 프로그램에서 기본 샘플링 알고리즘을 사용하여 통계를 생성합니다. 분할된 인덱스로 데이터베이스를 업그레이드한 후 인덱스에 대한 히스토그램 데이터가 달라집니다. 이 동작 변경이 쿼리 성능에는 영향을 주지 않을 수 있습니다. 테이블의 모든 행을 검사하여 분할된 인덱스에 대한 통계를 얻으려면 FULLSCAN 절에서 CREATE STATISTICS 또는 UPDATE STATISTICS를 사용합니다.

XML 값 메서드에 의한 데이터 형식 변환이 변경됨

xml 데이터 형식의 value 메서드에 대한 내부 동작이 변경되었습니다. 이 메서드는 XML에 대해 XQuery를 수행하고 지정된 SQL Server 데이터 형식의 스칼라 값을 반환합니다. xs 형식은 SQL Server 데이터 형식으로 변환해야 합니다. 이전에는 value 메서드가 원본 값을 xs:string으로 내부적으로 변환한 다음 xs:string을 SQL Server 데이터 형식으로 변환했습니다. SQL Server 2012에서는 다음과 같은 경우에 xs:string으로의 변환이 생략됩니다.

원본 XS 데이터 형식

대상 SQL Server 데이터 형식

byte

short

int

integer

long

unsignedByte

unsignedShort

unsignedInt

unsignedLong

positiveInteger

nonPositiveInteger

negativeInteger

nonNegativeInteger

tinyint

smallint

int

bigint

decimal

numeric

decimal

decimal

numeric

float

real

double

float

중간 변환을 건너뛸 수 있는 경우 새로운 동작으로 인해 성능이 향상됩니다. 그러나 데이터 형식 변환에 실패하는 경우 중간 xs:string 값에서 변환할 때 발생했던 오류 메시지와 다른 메시지가 표시됩니다. 예를 들어 value 메서드에서 int 값 100000을 smallint로 변환하는 데 실패한 경우 이전에 표시된 오류 메시지는 다음과 같습니다.

The conversion of the nvarchar value '100000' overflowed an INT2 column. Use a larger integer column.

SQL Server 2012에서는 xs:string으로의 중간 변환 없이 다음과 같은 오류 메시지가 표시됩니다.

Arithmetic overflow error converting expression to data type smallint.

XML 모드에서의 sqlcmd.exe 동작 변경 내용

SELECT * from T FOR XML …을 실행할 때 XML 모드(:XML ON 명령)에서 sqlcmd.exe를 사용할 경우 동작 변경 내용이 있습니다. 자세한 내용은 향상된 관리 기능(데이터베이스 엔진)을 참조하십시오.

DBCC CHECKIDENT 수정 메시지

SQL Server 2012에서 DBCC CHECKIDENT 명령을 통해 반환되는 메시지는 해당 명령을 RESEED new_reseed_value 에 사용하는 경우에만 현재 ID 값을 변경하도록 변경되었습니다. 새 메시지는 다음과 같습니다. "ID 정보 확인: 현재 ID 값은 '<current identity value>'입니다. DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오."

이전 버전의 메시지는 다음과 같습니다. "ID 정보 확인: 현재 ID 값은 '<current identity value>'이며, 현재 열 값은 '<current column value>'입니다. DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오." DBCC CHECKIDENT를 지정할 때 NORESEED를 사용하거나 두 번째 매개 변수를 사용하지 않거나 reseed 값을 사용하지 않으면 메시지가 변경되지 않습니다. 자세한 내용은 DBCC CHECKIDENT(Transact-SQL)를 참조하십시오.

XML 데이터 형식에서의 exist() 함수 동작이 변경됨

null 값이 있는 XML 데이터 형식을 0과 비교할 때 exist() 함수의 동작이 변경되었습니다. 다음 예를 살펴 보십시오.

DECLARE @test XML;
SET @test = null;
SELECT COUNT(1) WHERE @test.exist('/dogs') = 0;

이전 버전에서는 이러한 비교 시 1(true)이 반환되었는데 이제는 0(false)이 반환됩니다.

다음 비교는 변경되지 않았습니다.

DECLARE @test XML;
SET @test = null;
SELECT COUNT(1) WHERE @test.exist('/dogs') = 1; -- 0 expected, 0 returned
SELECT COUNT(1) WHERE @test.exist('/dogs') IS NULL; -- 1 expected, 1 returned

참고 항목

참조

SQL Server 2012 데이터베이스 엔진 기능의 주요 변경

SQL Server 2012 이후에는 지원되지 않는 데이터베이스 엔진 기능

SQL Server 2012에서 지원되지 않는 데이터베이스 엔진 기능

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