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

В этом разделе описываются изменения в поведении ядра СУБД. Изменения в поведении влияют на то, как функции работают или взаимодействуют в SQL Server 2014 по сравнению с более ранними версиями SQL Server.

Изменения в поведении в SQL Server 2014 г.

В более ранних версиях SQL Server запросы к XML-документу, который содержит строки определенной длины (более 4020 символов), могут возвращать неверные результаты. В SQL Server 2014 году такие запросы возвращают правильные результаты.

Изменения в поведении SQL Server 2012

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

Улучшения ядра СУБД, начиная с 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 функция имеет необязательный базовый параметр. Дополнительные сведения см. в разделе LOG (Transact-SQL).

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

В SQL Server 2014 году статистика не создается путем сканирования всех строк в таблице при создании или перестроении секционированного индекса. Вместо этого оптимизатор запросов использует для создания статистики алгоритм выборки по умолчанию. После обновления базы данных с секционированными индексами можно заметить разницу в гистограммах для этих индексов. Это изменение в поведении может не влиять на время выполнения запросов. Для получения статистики по секционированным индексам путем сканирования всех строк таблицы используйте инструкции 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 2014 г. преобразование в xs:string пропускается в следующих случаях:

Исходный тип данных XS Целевой тип данных SQL Server
byte

short

INT

Целое число

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 2014 г. без промежуточного преобразования в xs:string отображается следующее сообщение об ошибке:

Arithmetic overflow error converting expression to data type smallint.

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

Если вы используете sqlcmd.exe с режимом XML (команда :XML ON) при выполнении инструкции SELECT * из T FOR XML.

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

В SQL Server 2012 г. сообщение, возвращаемое командой DBCC CHECKIDENT, изменилось только в том случае, если оно используется с new_reseed_value RESEED для изменения текущего значения удостоверения. Новое сообщение — "Проверка сведений об удостоверениях: текущее значение удостоверения "<текущее значение> удостоверения". Выполнение инструкции 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 2014
Устаревшие функции компонента Database Engine в SQL Server 2014
Неподдерживаемые функции ядра СУБД в SQL Server 2014
Уровень совместимости инструкции ALTER DATABASE (Transact-SQL)