Поделиться через


Изменения в работе функций компонента Database Engine в SQL Server 2012

В этом разделе описаны изменения в компоненте Компонент Database Engine. Изменения в работе затрагивают выполнение функций или взаимодействие функций в SQL Server 2012 по сравнению с предыдущими версиями SQL Server.

Обнаружение метаданных

Улучшенный компонент Компонент Database Engine, появившиеся с версии SQL Server 2012, позволяют SQLDescribeCol получать более точные описания ожидаемых результатов, чем те, которые SQLDescribeCol возвращал в предыдущих версиях SQL Server. Дополнительные сведения см. в разделе Обнаружение метаданных.

Параметр 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 задается значением свойства IsDeterministic атрибута SqlFunctionAttribute или SqlMethodAttribute.

Изменение работы метода 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

У функции LOG появился необязательный параметр base. Дополнительные сведения см. в разделе LOG (Transact-SQL).

Изменение статистических вычислений во время операций с секционированным индексом

Статистические данные в SQL Server 2012 не создаются путем сканирования всех строк таблицы при создании или перестроении секционированного индекса. Вместо этого оптимизатор запросов использует для создания статистики алгоритм выборки по умолчанию. После обновления базы данных с секционированными индексами можно заметить разницу в гистограммах для этих индексов. Это изменение в поведении может не влиять на время выполнения запросов. Для получения статистики по секционированным индексам путем сканирования всех строк таблицы используйте инструкции CREATE STATISTICS или UPDATE STATISTICS с предложением FULLSCAN.

Изменение преобразования типов данных XML-методом value

Скрытое поведение метода value типа данных xml изменилось. Этот метод выполняет запрос XQuery к XML-данным и возвращает скалярное значение указанного типа данных 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 не смог преобразовать значение 100 000 типа int в 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.

Изменение в работе программы sqlcmd.exe в режиме XML

Изменилась работа программы sqlcmd.exe в режиме XML (команда :XML ON) при выполнении инструкций SELECT * from T FOR XML… Дополнительные сведения см. в разделе Улучшенное управление (компонент Database Engine).

Измененное сообщение DBCC CHECKIDENT

В SQL Server 2012 сообщение, возвращаемое командой DBCC CHECKIDENT, изменяется, только когда она используется вместе с RESEED new_reseed_value для изменения текущего значения идентификатора. Новое сообщение выглядит следующим образом: «Проверка идентификационных данных. Текущее значение идентификатора — <текущее значение идентификатора>. Выполнение инструкции DBCC завершено. Если инструкция DBCC выдает сообщения об ошибках, обратитесь к системному администратору».

В более ранних версиях сообщение выглядело следующим образом: «Проверка идентификационных данных. Текущее значение идентификатора — <текущее значение идентификатора>, текущее значение столбца — <текущее значение столбца>. Выполнение инструкции DBCC завершено. Если инструкция DBCC выдает сообщения об ошибках, обратитесь к системному администратору». Это сообщение не меняется, если команда DBCC CHECKIDENT указана вместе с NORESEED, без второго параметра или без значения для повторного заполнения. Дополнительные сведения см. в разделе DBCC CHECKIDENT (Transact-SQL).

Изменилась работа функции exist() типа данных XML

Изменилась работа функции exist() при сравнении типа данных XML со значением NULL с 0 (нулем). Рассмотрим следующий пример:

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

Устаревшие функции компонента Database Engine в SQL Server 2012

Неподдерживаемые функции ядра СУБД в SQL Server 2012

Уровень совместимости инструкции ALTER DATABASE (Transact-SQL)