Изменения в работе функций компонента 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)