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

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Определяет поведение обработки запросов и Transact-SQLTransact-SQL для обеспечения совместимости с указанной версией Компонент SQL Server Database EngineSQL Server Database Engine.Sets Transact-SQLTransact-SQL and query processing behaviors to be compatible with the specified version of the Компонент SQL Server Database EngineSQL Server Database Engine. См. дополнительные сведения о других параметрах ALTER DATABASE.For other ALTER DATABASE options, see ALTER DATABASE.

Дополнительные сведения о соглашениях о синтаксисе см. в статье Соглашения о синтаксисе в Transact-SQL.For more information about the syntax conventions, see Transact-SQL Syntax Conventions.

СинтаксисSyntax

ALTER DATABASE database_name
SET COMPATIBILITY_LEVEL = { 150 | 140 | 130 | 120 | 110 | 100 | 90 }

АргументыArguments

database_name database_name
Имя изменяемой базы данных.Is the name of the database to be modified.

COMPATIBILITY_LEVEL { 150 | 140 | 130 | 120 | 110 | 100 | 90 | 80 }COMPATIBILITY_LEVEL { 150 | 140 | 130 | 120 | 110 | 100 | 90 | 80 }
Версия SQL ServerSQL Server, с которой необходимо обеспечить совместимость базы данных.Is the version of SQL ServerSQL Server with which the database is to be made compatible. Можно настроить следующие значения уровня совместимости (не все версии поддерживают все перечисленные в списке выше уровни совместимости):The following compatibility level values can be configured (not all versions supports all of the above listed compatibility level):

ПродуктProduct Версия ядра СУБДDatabase Engine Version Назначение уровня совместимости по умолчаниюDefault Compatibility Level Designation Поддерживаемые значения уровня совместимостиSupported Compatibility Level Values
SQL Server 2019 (15.x)SQL Server 2019 (15.x) 1515 150150 150, 140, 130, 120, 110, 100150, 140, 130, 120, 110, 100
SQL Server 2017 (14.x)SQL Server 2017 (14.x) 1414 140140 140, 130, 120, 110, 100140, 130, 120, 110, 100
База данных SQL AzureAzure SQL Database отдельная база данных/эластичный пулsingle database/elastic pool 1212 140140 150, 140, 130, 120, 110, 100150, 140, 130, 120, 110, 100
База данных SQL AzureAzure SQL Database управляемый экземплярmanaged instance 1212 140140 150, 140, 130, 120, 110, 100150, 140, 130, 120, 110, 100
SQL Server 2016 (13.x)SQL Server 2016 (13.x) 1313 130130 130, 120, 110, 100130, 120, 110, 100
SQL Server 2014 (12.x)SQL Server 2014 (12.x) 1212 120120 120, 110, 100120, 110, 100
SQL Server 2012 (11.x)SQL Server 2012 (11.x) 1111 110110 110, 100, 90110, 100, 90
SQL Server 2008 R2SQL Server 2008 R2 10.510.5 100100 100, 90, 80100, 90, 80
SQL Server 2008SQL Server 2008 1010 100100 100, 90, 80100, 90, 80
SQL Server 2005 (9.x)SQL Server 2005 (9.x) 99 9090 90, 8090, 80
SQL Server 2000 (8.x)SQL Server 2000 (8.x) 88 8080 8080

RemarksRemarks

Для всех установок SQL ServerSQL Server уровень совместимости по умолчанию установлен в зависимости от версии Компонент Database EngineDatabase Engine.For all installations of SQL ServerSQL Server, the default compatibility level is associated with the version of the Компонент Database EngineDatabase Engine. Для новых баз данных он устанавливается в это же значение, если для базы данных model не установлен более низкий уровень совместимости.New databases are set to this level unless the model database has a lower compatibility level. Для базы данных, присоединяемой или обновляемой с любой более ранней версии SQL ServerSQL Server, сохраняется существующий уровень совместимости, если он не ниже минимального значения, допустимого в этом экземпляре SQL ServerSQL Server.For databases attached or restored from any earlier version of SQL ServerSQL Server, the database retains its existing compatibility level, if it is at least minimum allowed for that instance of SQL ServerSQL Server. При перемещении базы данных с уровнем совместимости ниже допустимого в Компонент Database EngineDatabase Engine автоматически устанавливается минимальный допустимый уровень совместимости.Moving a database with a compatibility level lower than the allowed level by the Компонент Database EngineDatabase Engine, automatically sets the database to the lowest compatibility level allowed. Это относится и к системным, и к пользовательским базам данных.This applies to both system and user databases.

При подключении или восстановлении базы данных, а также после обновления на месте в SQL Server 2017 (14.x)SQL Server 2017 (14.x) ожидается описанное ниже поведение.The below behaviors are expected for SQL Server 2017 (14.x)SQL Server 2017 (14.x) when a database is attached or restored, and after an in-place upgrade:

  • Если уровень совместимости пользовательской базы данных до обновления был 100 или выше, после обновления он останется таким же.If the compatibility level of a user database was 100 or higher before the upgrade, it remains the same after upgrade.
  • Если уровень совместимости пользовательской базы данных до обновления был равен 90, в обновленной базе данных он получает значение 100, что соответствует минимальному поддерживаемому уровню совместимости в SQL Server 2017 (14.x)SQL Server 2017 (14.x).If the compatibility level of a user database was 90 before upgrade, in the upgraded database, the compatibility level is set to 100, which is the lowest supported compatibility level in SQL Server 2017 (14.x)SQL Server 2017 (14.x).
  • Уровням совместимости баз данных tempdb, model, msdb и Resource задается значение уровня по умолчанию для заданной версии Компонент Database EngineDatabase Engine.The compatibility levels of the tempdb, model, msdb and Resource databases are set to the default compatibility level for a given Компонент Database EngineDatabase Engine version.
  • Системная база данных master сохраняет уровень совместимости, который она имела до обновления.The master system database retains the compatibility level it had before upgrade.

Измените уровень совместимости базы данных с помощью инструкции ALTER DATABASE.Use ALTER DATABASE to change the compatibility level of the database. Новый параметр уровня совместимости для базы данных вступит в силу после выдачи USE <database> или обработки нового имени входа в этой базе данных в качестве контекста базы данных по умолчанию.The new compatibility level setting for a database takes effect when a USE <database> command is issued, or a new login is processed with that database as the default database context. Чтобы просмотреть текущий уровень совместимости базы данных, запросите столбец compatibility_level представления каталога sys.databases.To view the current compatibility level of a database, query the compatibility_level column in the sys.databases catalog view.

Примечание

База данных распространителя, созданная в более ранней версии SQL ServerSQL Server и обновленная до версии SQL Server 2016 (13.x)SQL Server 2016 (13.x) RTM или версии с пакетом обновления 1, получает уровень совместимости 90, который не поддерживается для других баз данных.A distribution database that was created in an earlier version of SQL ServerSQL Server and is upgraded to SQL Server 2016 (13.x)SQL Server 2016 (13.x) RTM or Service Pack 1 has a compatibility level of 90, which is not supported for other databases. Это не влияет на функциональные возможности репликации.This does not have an impact on the functionality of replication. В результате обновления до последних пакетов обновления и версий SQL ServerSQL Server уровень совместимости базы данных распространителя будет увеличен до уровня, соответствующего базе данных master.Upgrading to later service packs and versions of SQL ServerSQL Server will result in the compatibility level of the distribution database to be increased to match that of the master database.

Примечание

По состоянию на январь 2018 г. в База данных SQL AzureAzure SQL Database для создаваемых баз данных по умолчанию применяется уровень совместимости 140.As of January 2018, in База данных SQL AzureAzure SQL Database, the default compatibility level is 140 for newly created databases. MicrosoftMicrosoft не обновляет уровень совместимости для существующих баз данных.does not update Database Compatibility Level for existing databases. Это осуществляют заказчики по собственному усмотрению.It is up to customers to do at their own discretion.
MicrosoftMicrosoft настоятельно рекомендует клиентам запланировать обновление до последнего уровня совместимости, чтобы они могли использовать самые новые улучшения, связанные с оптимизацией запросов.highly recommends that customers plan to upgrade to the latest compatibility level in order to leverage the latest query optimization improvements.

Если в целом вам требуется уровень 120 или выше, но по определенной причине вы предпочитаете модель оценки кратности SQL Server 2012 (11.x)SQL Server 2012 (11.x), соответствующую уровню совместимости 110, см. подробнее об ALTER DATABASE SCOPED CONFIGURATION и ключевом слове LEGACY_CARDINALITY_ESTIMATION = ON.To leverage Database Compatibility Level 120 or higher for a database overall, but opt-in to the cardinality estimation model of SQL Server 2012 (11.x)SQL Server 2012 (11.x), which maps to Database Compatibility Level 110, see ALTER DATABASE SCOPED CONFIGURATION, and in particular its keyword LEGACY_CARDINALITY_ESTIMATION = ON.

Подробные сведения о том, как оценить разницу в производительности наиболее важных запросов на двух разных уровнях совместимости в База данных SQL AzureAzure SQL Database, см. в статье Улучшенная производительность запросов для уровня совместимости 130 базы данных SQL Azure.For details about how to assess the performance differences of your most important queries, between two different compatibility levels on База данных SQL AzureAzure SQL Database, see Improved Query Performance with Compatibility Level 130 in Azure SQL Database. Обратите внимание, что в этой статье описывается уровень совместимости 130 и SQL ServerSQL Server, но при обновлении до уровня 140 в SQL ServerSQL Server и База данных SQL AzureAzure SQL Database применяется та же методология.Note that this article refers to compatibility level 130 and SQL ServerSQL Server, but the same methodology applies for upgrades to 140 in SQL ServerSQL Server and База данных SQL AzureAzure SQL Database.

Чтобы определить версию Компонент Database EngineDatabase Engine, к которой вы подключены, выполните указанный ниже запрос.To determine the version of the Компонент Database EngineDatabase Engine that you are connected to, execute the following query.

SELECT SERVERPROPERTY('ProductVersion');

Примечание

В База данных SQL AzureAzure SQL Database поддерживаются не все функции, которые зависят от уровня совместимости.Not all features that vary by compatibility level are supported on База данных SQL AzureAzure SQL Database.

Чтобы определить текущий уровень совместимости, запросите столбец compatibility_level в представлении sys.databases.To determine the current compatibility level, query the compatibility_level column of sys.databases.

SELECT name, compatibility_level FROM sys.databases;

Уровни совместимости и обновления ядра СУБДCompatibility levels and Database Engine upgrades

Уровень совместимости базы данных — это полезное средство, помогающее модернизировать базу данных. Оно позволяет обновлять Компонент SQL Server Database EngineSQL Server Database Engine с сохранением работоспособности подключенных приложений благодаря поддержанию уровню совместимости, который существовал до обновления.Database Compatibility Level is a valuable tool to assist in database modernization, by allowing the Компонент SQL Server Database EngineSQL Server Database Engine to be upgraded, while keeping connecting applications functional status by maintaining the same pre-upgrade Database Compatibility Level. Это означает, что можно выполнить обновление с более старой версии SQL ServerSQL Server (например, SQL Server 2008SQL Server 2008) до SQL ServerSQL Server или База данных SQL AzureAzure SQL Database (включая Управляемый экземпляр) без изменения приложения (за исключением подключения к базе данных).This means that it is possible to upgrade from an older version of SQL ServerSQL Server (such as SQL Server 2008SQL Server 2008) to SQL ServerSQL Server or База данных SQL AzureAzure SQL Database (including Managed Instance) with no application changes (except for database connectivity). Дополнительные сведения см. в статье Сертификация на совместимость.For more information, see Compatibility Certification.

Если приложению не нужно использовать улучшения, доступные только на более высоком уровне совместимости, допускается обновлять Компонент SQL Server Database EngineSQL Server Database Engine с сохранением прежнего уровня совместимости.As long as the application does not need to leverage enhancements that are only available in a higher Database Compatibility Level, it is a valid approach to upgrade the Компонент SQL Server Database EngineSQL Server Database Engine and maintain the previous Database Compatibility Level. Дополнительные сведения об использовании уровня совместимости для обеспечения обратной совместимости см. в статье Сертификация на совместимость.For more information on using compatibility level for backward compatibility, see Compatibility Certification.

Рекомендации по обновлению уровня совместимости базы данныхBest Practices for upgrading Database Compatibility Level

Рекомендуемый рабочий процесс для обновления уровня совместимости см. в статье Изменение режима совместимости базы данных и использование хранилища запросов.For the recommended workflow for upgrading the compatibility level, see Change the Database Compatibility Mode and use the Query Store. Также см. подробнее об обновлении уровня совместимости базы данных с помощью помощника по настройке запросов.Additionally, for an assisted experience with upgrading the Database Compatibility Level, see Upgrading Databases by using the Query Tuning Assistant.

Уровни совместимости и хранимые процедурыCompatibility Levels and Stored Procedures

При выполнении хранимой процедуры используется текущий уровень совместимости базы данных, в которой она была определена.When a stored procedure executes, it uses the current compatibility level of the database in which it is defined. Когда настройка совместимости базы данных подвергается изменению, все хранимые процедуры этой базы данных автоматически перекомпилируются соответствующим образом.When the compatibility setting of a database is changed, all of its stored procedures are automatically recompiled accordingly.

Использование уровня совместимости для обеспечения обратной совместимостиUsing compatibility level for backward compatibility

Параметр уровня совместимости базы данных обеспечивает обратную совместимость с более ранними версиями SQL ServerSQL Server в плане поведения Transact-SQLTransact-SQL и оптимизации запросов только для указанной базы данных, а не всего сервера.The Database Compatibility Level setting provides backward compatibility with earlier versions of SQL ServerSQL Server in what relates to Transact-SQLTransact-SQL and query optimization behaviors only for the specified database, not for the entire server.

Начиная с режима совместимости 130 новые возможности и исправления, влияющие на план запроса, намеренно добавлены только к новому режиму совместимости.Starting with compatibility mode 130, any new query plan affecting fixes and features have been intentionally added only to the new compatibility level. Это сделано для того, чтобы свести к минимуму риск во время обновления, связанный со снижением производительности из-за изменения плана определяемого новым поведением оптимизации запросов.This has been done in order to minimize the risk during upgrades that arise from performance degradation due to query plan changes potentially introduced by new query optimization behaviors.

На стороне приложения используйте более низкий уровень совместимости в качестве более безопасного варианта в процессе устранения проблем, возникших из-за различий в поведении между версиями, которые определяются соответствующей настройкой уровня совместимости.From an application perspective, use the lower compatibility level as a safer migration path to work around version differences, in the behaviors that are controlled by the relevant compatibility level setting. Целью по-прежнему должно являться обновление до последнего уровня совместимости в какой-то момент времени, позволяющее наследовать некоторые новые возможности, включая интеллектуальную обработку запросов. Однако делать это нужно контролируемо.The goal should still be to upgrade to the latest compatibility level at some point in time, in order to inherit some of the new features such as Intelligent Query Processing, but to do so in a controlled way.

Дополнительные сведения, включая рекомендуемую процедуру для повышения уровня совместимости базы данных, см. в разделе Рекомендации по обновлению уровня совместимости базы данных.For more details, including the recommended workflow for upgrading Database Compatibility Level, see Best Practices for upgrading Database Compatibility Level.

Важно!

Нерекомендуемые функциональные возможности, представленные в определенной версии SQL ServerSQL Server, не защищены уровнем совместимости.Discontinued functionality introduced in a given SQL ServerSQL Server version is not protected by compatibility level. Это относится к возможностям, удаленным из Компонент SQL Server Database EngineSQL Server Database Engine.This refers to functionality that was removed from the Компонент SQL Server Database EngineSQL Server Database Engine. Например, указание FASTFIRSTROW больше не поддерживается в SQL Server 2012 (11.x)SQL Server 2012 (11.x) и заменено на указание OPTION (FAST n ).For example, the FASTFIRSTROW hint was discontinued in SQL Server 2012 (11.x)SQL Server 2012 (11.x) and replaced with the OPTION (FAST n ) hint. Если задать уровень совместимости базы данных 110, нерекомендуемое указание не будет восстановлено.Setting the Database Compatibility Level to 110 will not restore the discontinued hint.

См. подробнее о нерекомендуемых функциях в разделах Нерекомендуемые функции ядра СУБД в SQL Server 2016, Нерекомендуемые функции ядра СУБД в SQL Server 2014, Нерекомендуемые функции ядра СУБД в SQL Server 2012.For more information on discontinued functionality, see Discontinued Database Engine Functionality in SQL Server 2016, Discontinued Database Engine Functionality in SQL Server 2014, and Discontinued Database Engine Functionality in SQL Server 2012.

Важно!

Критические изменения, введенные в определенной версии SQL ServerSQL Server, могут не защищаться уровнем совместимости.Breaking changes introduced in a given SQL ServerSQL Server version may not be protected by compatibility level. Это относится к изменениям в поведении между версиями Компонент SQL Server Database EngineSQL Server Database Engine.This refers to behavior changes between versions of the Компонент SQL Server Database EngineSQL Server Database Engine. Поведение Transact-SQLTransact-SQL обычно защищено уровнем совместимости.Transact-SQLTransact-SQL behavior is usually protected by compatibility level. Однако измененные или удаленные системные объекты не защищены уровнем совместимости.However, changed or removed system objects are not protected by compatibility level.

Пример критических изменений, защищенных уровнем совместимости — неявное преобразование данных из типа datetime в тип datetime2.An example of a breaking change protected by compatibility level is an implicit conversion from datetime to datetime2 data types. При уровне совместимости базы данных 130 эти преобразования демонстрируют повышенную точность благодаря учету долей миллисекунд. В результате преобразования дают иные значения.Under Database Compatibility Level 130, these show improved accuracy by accounting for the fractional milliseconds, resulting in different converted values. Чтобы восстановить прежнее поведение преобразования, задайте уровень совместимости базы данных 120 или ниже.To restore previous conversion behavior, set the Database Compatibility Level to 120 or lower.

Примеры критических изменений, не защищенных уровнем совместимости.Examples of breaking changes not protected by compatibility level are:

  • Изменение имен столбцов в системных объектах.Changed column names in system objects. В SQL Server 2012 (11.x)SQL Server 2012 (11.x) столбец single_pages_kb в представлении sys.dm_os_sys_info был переименован в pages_kb.In SQL Server 2012 (11.x)SQL Server 2012 (11.x) the column single_pages_kb in sys.dm_os_sys_info was renamed to pages_kb. Независимо от уровня совместимости запрос SELECT single_pages_kb FROM sys.dm_os_sys_info вызывает ошибку 207 (Недопустимое имя столбца).Regardless of the compatibility level, the query SELECT single_pages_kb FROM sys.dm_os_sys_info will produce error 207 (Invalid column name).
  • Удаление системных объектов.Removed system objects. В SQL Server 2012 (11.x)SQL Server 2012 (11.x) столбец sp_dboption был удален.In SQL Server 2012 (11.x)SQL Server 2012 (11.x) the sp_dboption was removed. Независимо от уровня совместимости инструкция EXEC sp_dboption 'AdventureWorks2016', 'autoshrink', 'FALSE'; вызовет ошибку 2812 (Не удалось найти хранимую процедуру 'sp_dboption').Regardless of the compatibility level, the statement EXEC sp_dboption 'AdventureWorks2016', 'autoshrink', 'FALSE'; will produce error 2812 (Could not find stored procedure 'sp_dboption').

Подробные сведения о критических изменениях см. в статьях Критические изменения в функциях ядра СУБД в SQL Server 2017 (14.x), Критические изменения в функциях ядра СУБД в SQL Server 2016, Discontinued Database Engine Functionality in SQL Server 2014 (Неподдерживаемые функции ядра СУБД в SQL Server 2014) и в разделе Discontinued Features in SQL Server 2012 (Неподдерживаемые функции в SQL Server 2012).For more information on breaking changes, see Breaking Changes to Database Engine Features in SQL Server 2017, Breaking Changes to Database Engine Features in SQL Server 2016, Breaking Changes to Database Engine Features in SQL Server 2014, and Breaking Changes to Database Engine Features in SQL Server 2012.

Различия между уровнями совместимостиDifferences between Compatibility Levels

Для всех установок SQL ServerSQL Server уровень совместимости по умолчанию установлен в зависимости от версии Компонент Database EngineDatabase Engine, как указано в этой таблице.For all installations of SQL ServerSQL Server, the default compatibility level is associated with the version of the Компонент Database EngineDatabase Engine, as seen in this table. Для новых задач разработки всегда планируйте сертификацию приложений на базе новейшего уровня совместимости базы данных.For new development work, always plan to certify applications on the latest Database Compatibility Level.

Но уровень совместимости базы данных также обеспечивает обратную совместимость с предыдущими версиями SQL ServerSQL Server, так как базы данных, подключенные или восстановленные из любой более ранней версии SQL ServerSQL Server, сохраняют свой имеющийся уровень совместимости (если они совпадают или выше минимально допустимого уровня совместимости).But Database Compatibility Level also provides backward compatibility with earlier versions of SQL ServerSQL Server, because databases attached or restored from any earlier version of SQL ServerSQL Server retain their existing compatibility level (if same or higher than the minimum allowed compatibility level). Это обсуждалось в разделе Использование уровня совместимости для обеспечения обратной совместимости этой статьи.This was discussed in the Using compatibility level for backward compatibility section of this article.

Начиная с уровня совместимости базы данных 130 все новые исправления и возможности, влияющие на планы запросов, были добавлены только в последний доступный уровень совместимости, также называемый уровнем совместимости по умолчанию.Starting with Database Compatibility Level 130, any new fixes and features affecting query plans have been added only to the latest compatibility level available, also called the default compatibility level. Это сделано для того, чтобы свести к минимуму риск во время обновления, связанный со снижением производительности из-за изменения плана, определяемого новым поведением оптимизации запросов.This has been done in order to minimize the risk during upgrades that arise from performance degradation due to query plan changes, potentially introduced by new query optimization behaviors.

Фундаментальные изменения, влияющие на план и добавляемые только к уровню совместимости по умолчанию новой версии Компонент Database EngineDatabase Engine:The fundamental plan-affecting changes added only to the default compatibility level of a new version of the Компонент Database EngineDatabase Engine are:

  1. Исправления оптимизатора запросов, выпущенные для предыдущих версий SQL ServerSQL Server с флагом трассировки 4199, автоматически включены в уровне совместимости по умолчанию для более новой версии SQL ServerSQL Server .Query Optimizer fixes released for previous SQL ServerSQL Server versions under trace flag 4199 become automatically enabled in the default compatibility level of a newer SQL ServerSQL Server version. Применимо к: SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x)) and База данных SQL AzureAzure SQL Database.

    Например, при выпуске SQL Server 2016 (13.x)SQL Server 2016 (13.x) все исправления оптимизатора запросов, выпущенные для предыдущих версий SQL ServerSQL Server (и соответствующие уровни совместимости 100–120), автоматически включены для баз данных, использующих уровень совместимости SQL Server 2016 (13.x)SQL Server 2016 (13.x) по умолчанию (130).For example, when SQL Server 2016 (13.x)SQL Server 2016 (13.x) was released, all the Query Optimizer fixes released for previous SQL ServerSQL Server versions (and respective compatibility levels 100 through 120) became automatically enabled for databases that use the SQL Server 2016 (13.x)SQL Server 2016 (13.x) default compatibility level (130). Необходимо явно включить только исправления оптимизатора запросов после выпуска RTM.Only post-RTM Query Optimizer fixes need to be explicitly enabled.

    Примечание

    Чтобы включить исправления оптимизатора запросов, можно использовать следующие методы:To enable Query Optimizer fixes, you can use the following methods:

    В дальнейшем при выпуске SQL Server 2017 (14.x)SQL Server 2017 (14.x) все исправления оптимизатора запросов, выпущенные после SQL Server 2016 (13.x)SQL Server 2016 (13.x) RTM, были автоматически включены для баз данных с использованием уровня совместимости по умолчанию SQL Server 2017 (14.x)SQL Server 2017 (14.x) (140).Later, when SQL Server 2017 (14.x)SQL Server 2017 (14.x) was released, all the Query Optimizer fixes released after SQL Server 2016 (13.x)SQL Server 2016 (13.x) RTM became automatically enabled for databases using the SQL Server 2017 (14.x)SQL Server 2017 (14.x) default compatibility level (140). Это накопительное поведение, которое включает также исправления всех предыдущих версий.This is a cumulative behavior that includes all previous versions fixes as well. Необходимо также явно включить только исправления оптимизатора запросов после выпуска RTM.Again, only post-RTM Query Optimizer fixes need to be explicitly enabled.

    В следующей таблице описывается это поведение:The following table summarizes this behavior:

    Версия ядра СУБДDatabase Engine (DE) version Уровень совместимости базы данныхDatabase Compatibility Level TF 4199TF 4199 Изменения в оптимизаторе запросов из всех предыдущих уровней совместимости базы данныхQO changes from all previous Database Compatibility Levels Изменения в оптимизаторе запросов для версии ядра СУБД после RTMQO changes for DE version post-RTM
    13 (SQL Server 2016 (13.x)SQL Server 2016 (13.x))13 (SQL Server 2016 (13.x)SQL Server 2016 (13.x)) 100–120100 to 120


    130130
    Выкл.Off
    Вкл.On

    Выкл.Off
    Вкл.On
    ОтключеноDisabled
    АктивированоEnabled

    EnabledEnabled
    АктивированоEnabled
    ВыключеноDisabled
    АктивированоEnabled

    ВыключеноDisabled
    АктивированоEnabled
    14 (SQL Server 2017 (14.x)SQL Server 2017 (14.x))14 (SQL Server 2017 (14.x)SQL Server 2017 (14.x)) 100–120100 to 120


    130130


    140140
    Выкл.Off
    Вкл.On

    Выкл.Off
    Вкл.On

    Выкл.Off
    Вкл.On
    ОтключеноDisabled
    АктивированоEnabled

    EnabledEnabled
    АктивированоEnabled

    EnabledEnabled
    АктивированоEnabled
    ВыключеноDisabled
    АктивированоEnabled

    ВыключеноDisabled
    АктивированоEnabled

    ВыключеноDisabled
    АктивированоEnabled
    15 (SQL Server 2019 (15.x)SQL Server 2019 (15.x)) и 12 (База данных SQL AzureAzure SQL Database)15 (SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and 12 (База данных SQL AzureAzure SQL Database) 100–120100 to 120


    130–140130 to 140


    150150
    Выкл.Off
    Вкл.On

    Выкл.Off
    Вкл.On

    Выкл.Off
    Вкл.On
    ОтключеноDisabled
    АктивированоEnabled

    EnabledEnabled
    АктивированоEnabled

    EnabledEnabled
    АктивированоEnabled
    ВыключеноDisabled
    АктивированоEnabled

    ВыключеноDisabled
    АктивированоEnabled

    ВыключеноDisabled
    АктивированоEnabled

    Важно!

    Исправления оптимизатора запросов, которые устраняют неверные результаты или ошибки нарушения прав доступа, не защищаются флагом трассировки 4199.Query Optimizer fixes that address wrong results or access violation errors are not protected by trace flag 4199. Эти исправления не считаются необязательными.Those fixes are not considered optional.

  2. Изменения Оценщика кратности, выпущенные в SQL ServerSQL Server и База данных SQL AzureAzure SQL Database, включены только на уровне совместимости по умолчанию в новой версии Компонент Database EngineDatabase Engine , но не на предыдущих уровнях совместимости.Changes to the Cardinality Estimator released on SQL ServerSQL Server and База данных SQL AzureAzure SQL Database are enabled only in the default compatibility level of a new Компонент Database EngineDatabase Engine version, but not on previous compatibility levels.

    Например, при выпуске SQL Server 2016 (13.x)SQL Server 2016 (13.x) изменения, внесенные в процесс оценки кратности, были доступны только для баз данных, использующих уровень совместимости SQL Server 2016 (13.x)SQL Server 2016 (13.x) по умолчанию (130).For example, when SQL Server 2016 (13.x)SQL Server 2016 (13.x) was released, changes to the cardinality estimation process were available only for databases using SQL Server 2016 (13.x)SQL Server 2016 (13.x) default compatibility level (130). Предыдущие уровни совместимости сохранили поведение оценки количества элементов, которое было доступно до SQL Server 2016 (13.x)SQL Server 2016 (13.x).Previous compatibility levels retained the cardinality estimation behavior that was available before SQL Server 2016 (13.x)SQL Server 2016 (13.x).

    Позже, при выпуске SQL Server 2017 (14.x)SQL Server 2017 (14.x), изменения, внесенные в процесс оценки кратности, были доступны только для баз данных, использующих уровень совместимости SQL Server 2017 (14.x)SQL Server 2017 (14.x) по умолчанию (140).Later, when SQL Server 2017 (14.x)SQL Server 2017 (14.x) was released, newer changes to the cardinality estimation process were available only for databases using SQL Server 2017 (14.x)SQL Server 2017 (14.x) default compatibility level (140). Уровень совместимости базы данных 130 сохраняет поведение оценки кратности SQL Server 2016 (13.x)SQL Server 2016 (13.x).Database Compatibility Level 130 retained the SQL Server 2016 (13.x)SQL Server 2016 (13.x) cardinality estimation behavior.

    В следующей таблице описывается это поведение:The following table summarizes this behavior:

    Версия ядра СУБДDatabase Engine version Уровень совместимости базы данныхDatabase Compatibility Level Изменения оценки кратности в новой версииNew version CE changes
    13 (SQL Server 2016 (13.x)SQL Server 2016 (13.x))13 (SQL Server 2016 (13.x)SQL Server 2016 (13.x)) < 130< 130
    130130
    ВыключеноDisabled
    АктивированоEnabled
    14 (SQL Server 2017 (14.x)SQL Server 2017 (14.x))114 (SQL Server 2017 (14.x)SQL Server 2017 (14.x))1 < 140< 140
    140140
    ВыключеноDisabled
    АктивированоEnabled
    15 (SQL Server 2019 (15.x)SQL Server 2019 (15.x))115 (SQL Server 2019 (15.x)SQL Server 2019 (15.x))1 < 150< 150
    150150
    ВыключеноDisabled
    АктивированоEnabled

    1 Также применимо к База данных SQL AzureAzure SQL Database.1 Also applicable to База данных SQL AzureAzure SQL Database.

Важно!

Другие различия между конкретными уровнями совместимости доступны в следующих разделах этой статьи.Other differences between specific compatibility levels are available in the next sections of this article.

Различия между уровнями совместимости 140 и 150Differences between Compatibility Level 140 and Level 150

В этом разделе описываются новые возможности, обусловленные появлением уровня совместимости 150.This section describes new behaviors introduced with compatibility level 150.

Уровень совместимости базы данных 150 сейчас предоставляется для База данных SQL AzureAzure SQL Database и SQL Server 2019 (15.x)SQL Server 2019 (15.x) в режиме общедоступной предварительной версии.Database Compatibility Level 150 is currently in Public Preview for База данных SQL AzureAzure SQL Database and SQL Server 2019 (15.x)SQL Server 2019 (15.x). Этот уровень совместимости базы данных будет связан с новым поколением улучшений обработки запросов наряду с улучшениями, реализованными на уровне совместимости 140.This Database Compatibility Level will be associated with the next generation of query processing improvements beyond what was introduced in Database Compatibility Level 140.

Уровень совместимости 140 и нижеCompatibility level setting of 140 or lower Уровень совместимости 150Compatibility level setting of 150
Реляционное хранилище данных и аналитические рабочие нагрузки могут не иметь возможности использовать индексы columnstore из-за ограничений OLTP, отсутствия поддержки поставщика или других ограничений.Relational data warehouse and analytic workloads may not be able to leverage columnstore indexes due to OLTP-overhead, lack of vendor support or other limitations. Без индексов columnstore эти рабочие нагрузки нельзя будет выполнять в пакетном режиме.Without columnstore indexes, these workloads cannot benefit from batch execution mode. Пакетный режим выполнения теперь доступен для аналитических рабочих нагрузок без необходимости использовать индексы columnstore.Batch execution mode is now available for analytic workloads without requiring columnstore indexes. Дополнительные сведения см. в разделе Пакетный режим для данных rowstore.For more information, see batch mode on rowstore.
Запросы в построчном режиме к временному буферу памяти недостаточного объема, которые приводят к временным записям на диск, могут по-прежнему вызывать проблемы при последовательном выполнении.Row-mode queries that request insufficient memory grant sizes that result in spills to disk may continue to have issues on consecutive executions. Запросы в построчном режиме к временному буферу памяти недостаточного объема, которые приводят к временным записям на диск, могут выполняться эффективнее при последовательном выполнении.Row-mode queries that request insufficient memory grant sizes that result in spills to disk may have improved performance on consecutive executions. Дополнительные сведения см. в разделе Обратная связь по временно предоставляемому буферу памяти в строковом режиме.For more information, see row mode memory grant feedback.
Запросы в построчном режиме к временному буферу памяти чрезмерного объема, которые приводят к проблемам параллелизма, могут по-прежнему вызывать проблемы при последовательном выполнении.Row-mode queries that request an excessive memory grant size that results in concurrency issues may continue to have issues on consecutive executions. Запросы в построчном режиме к временному буферу памяти чрезмерного объема, которые приводят к проблемам параллелизма, могут выполняться эффективнее при последовательном выполнении.Row-mode queries that request an excessive memory grant size that results in concurrency issues may have improved concurrency on consecutive executions. Дополнительные сведения см. в разделе Обратная связь по временно предоставляемому буферу памяти в строковом режиме.For more information, see row mode memory grant feedback.
Запросы, ссылающиеся на скалярные пользовательские функции T-SQL, будут применять итеративный вызов, сокращать издержки и предусматривать принудительное последовательное выполнение.Queries referencing T-SQL scalar UDFs will use iterative invocation, lack costing and force serial execution. Скалярные пользовательские функции T-SQL преобразуются в эквивалентные реляционные выражения, которые "встраиваются" в вызывающий запрос, что часто приводит к существенному повышению производительности.T-SQL scalar UDFs are transformed into equivalent relational expressions that are “inlined” into the calling query, often resulting in significant performance gains. Дополнительные сведения см. в разделе Встраивание скалярных пользовательских функций.For more information, see T-SQL scalar UDF inlining.
Табличные переменные используют фиксированную оценку для оценки кратности.Table variables use a fixed guess for the cardinality estimate. Если фактическое число строк значительно больше оценочного значения, может наблюдаться снижение производительности нисходящих операций.If the actual number of rows is much higher than the guessed value, performance of downstream operations can suffer. Теперь планируется использовать фактическую кратность табличной переменной, обнаруженную при первой компиляции, вместо фиксированной оценки.New plans will use the actual cardinality of the table variable encountered on first compilation instead of a fixed guess. Дополнительные сведения см. в разделе Отложенная компиляция табличных переменных.For more information, see table variable deferred compilation.

Дополнительные сведения о функциях обработки запросов, доступных на уровне 150 совместимости базы данных, см. в статьях Новые возможности в SQL Server 2019 и Интеллектуальная обработка запросов в базах данных SQL.For more information on query processing features enabled in Database Compatibility Level 150, refer to What's new in SQL Server 2019 and Intelligent query processing in SQL databases.

Различия между уровнями совместимости 130 и 140Differences between Compatibility Level 130 and Level 140

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 140.This section describes new behaviors introduced with compatibility level 140.

Уровень совместимости 130 и нижеCompatibility level setting of 130 or lower Уровень совместимости 140Compatibility level setting of 140
При оценке кратности для инструкций, ссылающихся на функции с табличным значением с несколькими инструкциями, используется предположение фиксированной строки.Cardinality estimates for statements referencing multi-statement table-valued functions use a fixed row guess. При оценке кратности для соответствующих инструкций, ссылающихся на функции с табличным значением с несколькими инструкциями, будет использоваться фактическая кратность из выходных данных функции.Cardinality estimates for eligible statements referencing multi-statement table-valued functions will use the actual cardinality of the function output. Это возможно благодаря выполнению с чередованием для функций с табличным значением с несколькими инструкциями.This is enabled via interleaved execution for multi-statement table-valued functions.
Запросы в пакетном режиме на недостаточный объем временно предоставляемого буфера памяти, которые приводят к переносам на диск, могут сохранять проблемы при последовательном выполнении.Batch-mode queries that request insufficient memory grant sizes that result in spills to disk may continue to have issues on consecutive executions. Запросы в пакетном режиме на недостаточный объем временно предоставляемого буфера памяти, которые приводят к переносам на диск, могут выполняться эффективнее при последовательном выполнении.Batch-mode queries that request insufficient memory grant sizes that result in spills to disk may have improved performance on consecutive executions. Этот возможно благодаря обратной связи по временно предоставляемому буферу памяти в пакетном режиме, которая обновляет размер временно предоставляемого буфера кэшированного плана, если для операторов пакетного режима произошел перенос.This is enabled via batch mode memory grant feedback which will update the memory grant size of a cached plan if spills have occurred for batch mode operators.
Запросы в пакетном режиме на чрезмерный объем временно предоставляемого буфера памяти, которые приводят к проблемам параллелизма, могут сохранять проблемы при последовательном выполнении.Batch-mode queries that request an excessive memory grant size that results in concurrency issues may continue to have issues on consecutive executions. Запросы в пакетном режиме на чрезмерный объем временно предоставляемого буфера памяти, которые приводят к проблемам параллелизма, будут выполняться эффективнее при последовательном выполнении.Batch-mode queries that request an excessive memory grant size that results in concurrency issues may have improved concurrency on consecutive executions. Этот возможно благодаря обратной связи по временно предоставляемому буферу памяти в пакетном режиме, которая обновляет размер временно предоставляемого буфера кэшированного плана, если был запрошен слишком большой объем.This is enabled via batch mode memory grant feedback which will update the memory grant size of a cached plan if an excessive amount was originally requested.
Запросы в пакетном режиме, содержащие операторы соединения, подходят для трех алгоритмов физического соединения, включая вложенный цикл, хэш-соединение и соединение слиянием.Batch-mode queries that contain join operators are eligible for three physical join algorithms, including nested loop, hash join and merge join. Если оценки кратности для входных данных соединения неверны, может быть выбран неправильный алгоритм соединения.If cardinality estimates are incorrect for join inputs, an inappropriate join algorithm may be selected. В этом случае производительность снижается, а неправильный алгоритм соединения будет использоваться до повторной компиляции кэшированного плана.If this occurs, performance will suffer and the inappropriate join algorithm will remain in use until the cached plan is recompiled. Существует дополнительный оператор соединения — адаптивное соединение.There is an additional join operator called adaptive join. Если оценки кратности для входных данных соединения со внешней сборкой неверны, может быть выбран неправильный алгоритм соединения.If cardinality estimates are incorrect for the outer build join input, an inappropriate join algorithm may be selected. Если это происходит и инструкция подходит для адаптивного соединения, для малых входных данных будет использоваться вложенный цикл, а для больших — хэш-соединение. Это будет происходить динамически, без перекомпиляции.If this occurs and the statement is eligible for an adaptive join, a nested loop will be used for smaller join inputs and a hash join will be used for larger join inputs dynamically without requiring recompilation.
Простейшие планы, ссылающиеся на индексы columnstore, не подходят для выполнения в пакетном режиме.Trivial plans referencing Columnstore indexes are not eligible for batch mode execution. Простейший план, ссылающийся на индексы columnstore, будет заменен на план, подходящий для выполнения в пакетном режиме.A trivial plan referencing Columnstore indexes will be discarded in favor of a plan that is eligible for batch mode execution.
Оператор UDX sp_execute_external_script может выполняться только в режиме строки.The sp_execute_external_script UDX operator can only run in row mode. Оператор UDX sp_execute_external_script может выполняться в пакетном режиме.The sp_execute_external_script UDX operator is eligible for batch mode execution.
Функции с табличным значением с несколькими инструкциями не могут выполняться с чередованиемMulti-statement table-valued functions (TVF's) do not have interleaved execution Выполнение с чередованием для функций с табличным значением с несколькими инструкциями для повышения качества плана.Interleaved execution for multi-statement TVFs to improve plan quality.

Исправления, которые включались флагом трассировки 4199 в версиях SQL Server до SQL Server 2017, теперь включены по умолчанию.Fixes that were under trace flag 4199 in earlier versions of SQL Server prior to SQL Server 2017 are now enabled by default. С режимом совместимости 140.With compatibility mode 140. Флаг трассировки 4199 по-прежнему можно использовать для новых исправлений оптимизатора запросов, выпущенных после SQL Server 2017.Trace flag 4199 will still be applicable for new query optimizer fixes that are released after SQL Server 2017. Дополнительные сведения о флаге трассировки 4199 см. в разделе Флаг трассировки 4199.For information about Trace Flag 4199, see Trace Flag 4199.

Различия между уровнями совместимости 120 и 130Differences between Compatibility Level 120 and Level 130

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 130.This section describes new behaviors introduced with compatibility level 130.

Уровень совместимости 120 и нижеCompatibility level setting of 120 or lower Уровень совместимости 130Compatibility level setting of 130
Операция INSERT в инструкции INSERT-SELECT является однопоточной.The INSERT in an INSERT-SELECT statement is single-threaded. Операция INSERT в инструкции INSERT-SELECT является многопоточной или может использовать параллельный план.The INSERT in an INSERT-SELECT statement is multi-threaded or can have a parallel plan.
Запросы в таблицах, оптимизированных для памяти, выполняются в одном потоке.Queries on a memory-optimized table execute single-threaded. Запросы в таблицах, оптимизированных для памяти, теперь могут иметь параллельные планы.Queries on a memory-optimized table can now have parallel plans.
Представлено в оценщике кратности SQL 2014 CardinalityEstimationModelVersion="120"Introduced the SQL 2014 Cardinality estimator CardinalityEstimationModelVersion="120" Дальнейшие улучшения оценки кратности в модели оценки кратности 130, видимой в плане запроса.Further cardinality estimation (CE) Improvements with the Cardinality Estimation Model 130 which is visible from a Query plan. CardinalityEstimationModelVersion="130"CardinalityEstimationModelVersion="130"
Изменения пакетного режима и режима строки в индексах columnstoreBatch mode versus Row Mode changes with Columnstore indexes:
  • Сортировка в таблице с индексом columnstore осуществляется в режиме строкиSorts on a table with Columnstore index are in Row mode
  • Оконные агрегатные функции выполняются в режиме строки, например LAG или LEADWindowing function aggregates operate in row mode such as LAG or LEAD
  • Запросы в таблицах columnstore с несколькими отдельными предложениями выполнялись в режиме строкиQueries on Columnstore tables with Multiple distinct clauses operated in Row mode
  • Запросы, выполняемые с MAXDOP 1 или последовательным планом, выполнялись в режиме строкиQueries running under MAXDOP 1 or with a serial plan executed in Row mode
Изменения пакетного режима и режима строки в индексах columnstoreBatch mode versus Row Mode changes with Columnstore indexes:
  • Сортировка в таблице с индексом columnstore осуществляется в пакетном режимеSorts on a table with a Columnstore index are now in batch mode
  • Оконные агрегатные функции теперь выполняются в пакетном режиме, например LAG или LEADWindowing aggregates now operate in batch mode such as LAG or LEAD
  • Запросы в таблицах columnstore с несколькими отдельными предложениями выполняются в пакетном режимеQueries on Columnstore tables with Multiple distinct clauses operate in Batch mode
  • Запросы, выполняемые с MAXDOP 1 или последовательным планом, выполняются в пакетном режимеQueries running under MAXDOP 1 or with a serial plan execute in Batch Mode
Статистика может обновляться автоматически.Statistics can be automatically updated. Логика, которая автоматически обновляет статистику, более агрессивна в больших таблицах.The logic which automatically updates statistics is more aggressive on large tables. На практике это должно снизить число случаев, когда у клиентов возникали проблемы с производительностью при выполнении частых запросов к новым вставленным строкам, если статистика не обновлялась и не получала эти значения.In practice, this should reduce cases where customers have seen performance issues on queries where newly inserted rows are queried frequently but where the statistics had not been updated to include those values.
Трассировка 2371 имеет значение OFF по умолчанию в SQL Server 2014 (12.x)SQL Server 2014 (12.x).Trace 2371 is OFF by default in SQL Server 2014 (12.x)SQL Server 2014 (12.x). Трассировка 2371 имеет значение ON по умолчанию в SQL Server 2016 (13.x)SQL Server 2016 (13.x).Trace 2371 is ON by default in SQL Server 2016 (13.x)SQL Server 2016 (13.x). Флаг трассировки 2371 дает средству автоматического обновления статистики инструкции делать выборку подмножества строк меньшего размера, но более эффективным образом, если в таблице очень много строк.Trace flag 2371 tells the auto statistics updater to sample a smaller yet wiser subset of rows, in a table that has a great many rows.

Одно из улучшений — включение в выборку большего количества строк, которые были вставлены недавно.One improvement is to include in the sample more rows that were inserted recently.

Еще одно улучшение — выполнение запросов во время обновления статистики, без блокировки запроса.Another improvement is to let queries run while the update statistics process is running, rather than blocking the query.
На уровне 120 выборка статистики осуществляется одним потоком.For level 120, statistics are sampled by a single-threaded process. На уровне 130 выборка статистики осуществляется несколькими потоками (параллельный процесс).For level 130, statistics are sampled by a multi-threaded process (parallel process).
Максимальное значение — 253 входящих внешних ключа.253 incoming foreign keys is the limit. На одну таблицу может ссылаться до 10 000 входящих внешних ключей или аналогичных элементов.A given table can be referenced by up to 10,000 incoming foreign keys or similar references. Ограничения см. в разделе Create Foreign Key Relationships.For restrictions, see Create Foreign Key Relationships.
Нерекомендуемые хэш-алгоритмы MD2, MD4, MD5, SHA и SHA1 разрешены.The deprecated MD2, MD4, MD5, SHA, and SHA1 hash algorithms are permitted. Допускаются только хэш-алгоритмы SHA2_256 и SHA2_512.Only SHA2_256 and SHA2_512 hash algorithms are permitted.
В SQL Server 2016 (13.x)SQL Server 2016 (13.x) усовершенствованы преобразования некоторых типов данных и некоторые редко используемые операции.SQL Server 2016 (13.x)SQL Server 2016 (13.x) includes improvements in some data types conversions and some (mostly uncommon) operations. Дополнительные сведения см. в статье Улучшения SQL Server 2016 для обработки некоторых типов данных и нестандартных операций.For details see SQL Server 2016 improvements in handling some data types and uncommon operations.
Функция STRING_SPLIT недоступна.The STRING_SPLIT function is not available. Функция STRING_SPLIT доступна при уровне совместимости 130 или выше.The STRING_SPLIT function is available under compatibility level 130 or above. Если уровень совместимости базы данных меньше 130, SQL ServerSQL Server не сможет найти и выполнить функцию STRING_SPLIT.If your Database Compatibility Level is lower than 130, SQL ServerSQL Server will not be able to find and execute STRING_SPLIT function.

Исправления, которые включались флагом трассировки 4199 в версиях SQL ServerSQL Server до SQL Server 2016 (13.x)SQL Server 2016 (13.x), теперь включены по умолчанию.Fixes that were under trace flag 4199 in earlier versions of SQL ServerSQL Server prior to SQL Server 2016 (13.x)SQL Server 2016 (13.x) are now enabled by default. С режимом совместимости 130.With compatibility mode 130. Флаг трассировки 4199 по-прежнему можно использовать для новых исправлений оптимизатора запросов, выпущенных после SQL Server 2016 (13.x)SQL Server 2016 (13.x).Trace flag 4199 will still be applicable for new query optimizer fixes that are released after SQL Server 2016 (13.x)SQL Server 2016 (13.x). Чтобы использовать старый оптимизатор запросов в База данных SQLSQL Database, необходимо выбрать уровень совместимости 110.To use the older query optimizer in База данных SQLSQL Database you must select compatibility level 110. Дополнительные сведения о флаге трассировки 4199 см. в разделе Флаг трассировки 4199.For information about Trace Flag 4199, see Trace Flag 4199.

Различия между уровнем 120 и более низкими уровнями совместимостиDifferences between Lower Compatibility Levels and Level 120

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 120.This section describes new behaviors introduced with compatibility level 120.

Уровень совместимости 110 и нижеCompatibility level setting of 110 or lower Уровень совместимости 120Compatibility level setting of 120
Используется старый оптимизатор запросов.The older query optimizer is used. В SQL Server 2014 (12.x)SQL Server 2014 (12.x) существенно усовершенствован компонент, предназначенный для создания и оптимизации планов запросов.SQL Server 2014 (12.x)SQL Server 2014 (12.x) includes substantial improvements to the component that creates and optimizes query plans. Эта новая функция оптимизатора запросов зависит от использования уровня совместимости базы данных 120.This new query optimizer feature is dependent upon use of the Database Compatibility Level 120. Новые приложения базы данных необходимо разрабатывать с использованием уровня совместимости базы данных 120, чтобы воспользоваться этими усовершенствованиями.New database applications should be developed using Database Compatibility Level 120 to take advantage of these improvements. Приложения, перенесенные из предыдущих версий SQL ServerSQL Server, необходимо тщательно тестировать, чтобы убедиться в сохранении или повышении их производительности.Applications that are migrated from earlier versions of SQL ServerSQL Server should be carefully tested to confirm that good performance is maintained or improved. Если производительность снизилась, можно задать уровень совместимости базы данных равным 110 или предыдущему значению для использования методологии оптимизатора запросов из прежних версий.If performance degrades, you can set the Database Compatibility Level to 110 or earlier to use the older query optimizer methodology.

На уровне совместимости базы данных 120 используется новый механизм оценки количества элементов, который настроен для современных рабочих нагрузок, связанных с хранением данных и OLTP.Database Compatibility Level 120 uses a new cardinality estimator that is tuned for modern data warehousing and OLTP workloads. Прежде чем устанавливать уровень совместимости базы данных 110 из-за проблем с производительностью, ознакомьтесь с подразделом, посвященным планам запросов, в статье SQL Server 2014 (12.x)SQL Server 2014 (12.x) Новые возможности в ядре СУБД.Before setting Database Compatibility Level to 110 because of performance issues, see the recommendations in the Query Plans section of the SQL Server 2014 (12.x)SQL Server 2014 (12.x) What's New in Database Engine topic.
Если уровень совместимости ниже 120, при преобразовании значения date в строковое параметр языка не учитывается.In compatibility levels lower than 120, the language setting is ignored when converting a date value to a string value. Обратите внимание, что это поведение характерно только для типа date.Note that this behavior is specific only to the date type. См. пример Б, приведенный ниже в разделе примеров.See example B in the Examples section below. Параметр языка учитывается при преобразовании значения date в строковое.The language setting is not ignored when converting a date value to a string value.
Рекурсивные ссылки в правой части предложения EXCEPT создают бесконечный цикл.Recursive references on the right-hand side of an EXCEPT clause create an infinite loop. Это поведение показано в примере В в разделе примеров.Example C in the Examples section below demonstrates this behavior. Рекурсивные ссылки в предложении EXCEPT вызывают ошибку в соответствии со стандартом ANSI SQL.Recursive references in an EXCEPT clause generates an error in compliance with the ANSI SQL standard.
Рекурсивное обобщенное табличное выражение допускает повторяющиеся имена столбцов.Recursive common table expression (CTE) allows duplicate column names. В рекурсивных обобщенных табличных выражениях повторяющиеся имена столбцов не разрешены.Recursive CTE does not allow duplicate column names.
Отключенные триггеры активируются при их изменении.Disabled triggers are enabled if the triggers are altered. Изменение триггера не меняет состояние триггера (отключен или включен).Altering a trigger does not change the state (enabled or disabled) of the trigger.
Табличное предложение OUTPUT INTO пропускает параметр IDENTITY_INSERT SETTING = OFF и позволяет вставлять явные значения.The OUTPUT INTO table clause ignores the IDENTITY_INSERT SETTING = OFF and allows explicit values to be inserted. Нельзя вставить явные значения для столбца идентификаторов в таблице, если параметр IDENTITY_INSERT имеет значение OFF.You cannot insert explicit values for an identity column in a table when IDENTITY_INSERT is set to OFF.
Если выбрано частичное включение базы данных, проверка поля $action в предложении OUTPUT инструкции MERGE может вернуть ошибку параметров сортировки.When the database containment is set to partial, validating the $action field in the OUTPUT clause of a MERGE statement can return a collation error. Параметры сортировки значений, возвращаемых предложением $action инструкции MERGE, — это параметры сортировки базы данных, а не сервера. Ошибка конфликтующих параметров сортировки сервера не возвращается.The collation of the values returned by the $action clause of a MERGE statement is the database collation instead of the server collation and a collation conflict error is not returned.
Инструкция SELECT INTO всегда создает однопоточную операцию вставки.A SELECT INTO statement always creates a single-threaded insert operation. Инструкция SELECT INTO может создать параллельную операцию вставки.A SELECT INTO statement can create a parallel insert operation. При вставке большого числа строк параллельная операция может увеличить производительность.When inserting a large number of rows, the parallel operation can improve performance.

Различия между более низкими уровнями совместимости и уровнями 100 и 110Differences between Lower Compatibility Levels and Levels 100 and 110

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 110.This section describes new behaviors introduced with compatibility level 110. Этот раздел также относится к уровням совместимости выше 110.This section also applies to compatibility levels above 110.

Уровень совместимости 100 и нижеCompatibility level setting of 100 or lower Уровень совместимости не ниже 110Compatibility level setting of at least 110
Объекты базы данных среды CLR выполняются в среде CLR версии 4.Common language runtime (CLR) database objects are executed with version 4 of the CLR. Однако некоторые из особенностей поведения, изменившиеся в версии 4 среды CLR, не используются.However, some behavior changes introduced in version 4 of the CLR are avoided. Дополнительные сведения см. в статье Новые возможности интеграции CLR.For more information, see What's New in CLR Integration. Объекты базы данных среды CLR выполняются в среде CLR версии 4.CLR database objects are executed with version 4 of the CLR.
Функции XQuery string-length и substring считают каждый суррогатный символ за два символа.The XQuery functions string-length and substring count each surrogate as two characters. Функции XQuery string-length и substring считают каждый суррогатный символ за один символ.The XQuery functions string-length and substring count each surrogate as one character.
PIVOT можно использовать в запросах рекурсивного обобщенного табличного выражения.PIVOT is allowed in a recursive common table expression (CTE) query. Однако при наличии нескольких строк в группировании запрос возвращает неверные результаты.However, the query returns incorrect results when there are multiple rows per grouping. PIVOT нельзя использовать в запросах рекурсивного обобщенного табличного выражения.PIVOT is not allowed in a recursive common table expression (CTE) query. Возвращается ошибка.An error is returned.
Алгоритм RC4 поддерживается только в целях обратной совместимости.The RC4 algorithm is only supported for backward compatibility. Когда база данных имеет уровень совместимости 90 или 100, новые материалы могут шифроваться только с помощью алгоритмов RC4 или RC4_128.New material can only be encrypted using RC4 or RC4_128 when the database is in compatibility level 90 or 100. (Не рекомендуется.) В SQL Server 2012 (11.x)SQL Server 2012 (11.x) материалы, зашифрованные с помощью алгоритмов RC4 или RC4_128, могут быть расшифрованы на любом уровне совместимости.(Not recommended.) In SQL Server 2012 (11.x)SQL Server 2012 (11.x), material encrypted using RC4 or RC4_128 can be decrypted in any compatibility level. Новые материалы нельзя шифровать с помощью RC4 или RC4_128.New material cannot be encrypted using RC4 or RC4_128. Используйте вместо этого более новые алгоритмы, например AES.Use a newer algorithm such as one of the AES algorithms instead. В SQL Server 2012 (11.x)SQL Server 2012 (11.x) материалы, зашифрованные с помощью алгоритмов RC4 или RC4_128, могут быть расшифрованы на любом уровне совместимости.In SQL Server 2012 (11.x)SQL Server 2012 (11.x), material encrypted using RC4 or RC4_128 can be decrypted in any compatibility level.
Используемый по умолчанию стиль для операций CAST и CONVERT над типами данных time и datetime2 — 121, кроме случая, когда любой из этих типов используется в выражении вычисляемого столбца.The default style for CAST and CONVERT operations on time and datetime2 data types is 121 except when either type is used in a computed column expression. Для вычисляемых столбцов используемый по умолчанию стиль — 0.For computed columns, the default style is 0. Это поведение влияет на вычисляемые столбцы при их создании и использовании в запросах с автоматической параметризацией, а также при использовании в определениях ограничений.This behavior impacts computed columns when they are created, used in queries involving auto-parameterization, or used in constraint definitions.

Разница между стилями 0 и 121 показана в примере Г в разделе примеров.Example D in the Examples section below shows the difference between styles 0 and 121. В примере не рассматривается описанное выше поведение.It does not demonstrate the behavior described above. Дополнительные сведения о стилях даты и времени см. в описании CAST и CONVERT.For more information about date and time styles, see CAST and CONVERT.
При уровне совместимости 110 стиль по умолчанию для операций CAST и CONVERT над типами данных time и datetime2 всегда имеет значение 121.Under compatibility level 110, the default style for CAST and CONVERT operations on time and datetime2 data types is always 121. Если запрос основан на прежнем поведении, следует использовать уровень совместимости ниже 110, либо явно задать в затрагиваемом запросе стиль 0.If your query relies on the old behavior, use a compatibility level less than 110, or explicitly specify the 0 style in the affected query.

Обновление базы данных до уровня совместимости 110 не приведет к изменению пользовательских данных, сохраненных на диске.Upgrading the database to compatibility level 110 will not change user data that has been stored to disk. Следует исправить эти данных соответствующим образом вручную.You must manually correct this data as appropriate. Например, если бы вы использовали предложение SELECT INTO для создания таблицы на основе источника, содержащего описанное выше выражение вычисляемого столбца, то сохранялись бы данные (благодаря стилю 0), а не само определение вычисляемого столбца.For example, if you used SELECT INTO to create a table from a source that contained a computed column expression described above, the data (using style 0) would be stored rather than the computed column definition itself. Потребовалось бы вручную обновлять эти данные в соответствии со стилем 121.You would need to manually update this data to match style 121.
Любые столбцы удаленных таблиц типа smalldatetime, фигурирующие в секционированном представлении, сопоставляются как тип datetime.Any columns in remote tables of type smalldatetime that are referenced in a partitioned view are mapped as datetime. Соответствующие им столбцы локальных таблиц (столбцы, занимающие те же порядковые позиции в списке выбора) должны иметь тип datetime.Corresponding columns in local tables (in the same ordinal position in the select list) must be of type datetime. Любые столбцы удаленных таблиц типа smalldatetime, фигурирующие в секционированном представлении, сопоставляются как тип smalldatetime.Any columns in remote tables of type smalldatetime that are referenced in a partitioned view are mapped as smalldatetime. Соответствующие им столбцы локальных таблиц (столбцы, занимающие те же порядковые позиции в списке выбора) должны иметь тип smalldatetime.Corresponding columns in local tables (in the same ordinal position in the select list) must be of type smalldatetime.

После обновления до уровня совместимости 110 произойдет сбой распределенного секционированного представления из-за несоответствия типа данных.After upgrading to 110, the distributed partitioned view will fail because of the data type mismatch. Данную проблему вы можете решить, изменив тип данных в удаленной таблице на datetime или задав уровень совместимости локальной базы данных 100 или ниже.You can resolve this by changing the data type on the remote table to datetime or setting the compatibility level of the local database to 100 or lower.
Функция SOUNDEX реализует следующие правила.SOUNDEX function implements the following rules:

1) Символы H и W в верхнем регистре игнорируются, если они разделяют 2 согласные, которые имеют одинаковый номер в коде SOUNDEX.1) Upper-case H or upper-case W are ignored when separating two consonants that have the same number in the SOUNDEX code.

2) Если первые 2 символа character_expression имеют одинаковый номер в коде SOUNDEX, включаются оба символа.2) If the first 2 characters of character_expression have the same number in the SOUNDEX code, both characters are included. В противном случае, если набор последовательных согласных в коде SOUNDEX имеет тот же номер, все они исключаются, кроме первого символа.Else, if a set of side-by-side consonants have the same number in the SOUNDEX code, all of them are excluded except the first.
Функция SOUNDEX реализует следующие правила.SOUNDEX function implements the following rules:

1) Если символы H или W в верхнем разделяют две согласные буквы, которые имеют одинаковый номер в коде SOUNDEX, то согласная буква, которая находится справа, игнорируется1) If upper-case H or upper-case W separate two consonants that have the same number in the SOUNDEX code, the consonant to the right is ignored

2) Если набор последовательных согласных в коде SOUNDEX имеет тот же номер, все они исключаются, кроме первого символа.2) If a set of side-by-side consonants have the same number in the SOUNDEX code, all of them are excluded except the first.



Функция SOUNDEX реализует дополнительные правила, при применении которых значения, вычисляемые функцией, могут отличаться от тех значений, которые были вычислены при другом уровне совместимости.The additional rules may cause the values computed by the SOUNDEX function to be different than the values computed under earlier compatibility levels. После обновления до уровня совместимости 110, возможно, придется перестроить индексы, кучи или ограничения CHECK, в которых используется функция SOUNDEX.After upgrading to compatibility level 110, you may need to rebuild the indexes, heaps, or CHECK constraints that use the SOUNDEX function. Дополнительные сведения см. в описании SOUNDEX.For more information, see SOUNDEX.

Различия между уровнями совместимости 90 и 100Differences between Compatibility Level 90 and Level 100

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 100.This section describes new behaviors introduced with compatibility level 100.

Уровень совместимости 90Compatibility level setting of 90 Уровень совместимости 100Compatibility level setting of 100 Вероятность влиянияPossibility of impact
Параметр QUOTED_IDENTIFER всегда имеет значение ON для возвращающих табличное значение функций, состоящих из нескольких инструкций, если эти функции созданы без учета параметра сеансового уровня.The QUOTED_IDENTIFER setting is always set to ON for multistatement table-valued functions when they are created regardless of the session level setting. Значение параметра сеанса QUOTED IDENTIFIER учитывается при создании возвращающих табличное значение функций, состоящих из нескольких инструкций.The QUOTED IDENTIFIER session setting is honored when multistatement table-valued functions are created. СреднийMedium
При создании или изменении функции секционирования литералы datetime и smalldatetime в функции вычисляются на основе предположения, что параметры языка имеют значение US_English.When you create or alter a partition function, datetime and smalldatetime literals in the function are evaluated assuming US_English as the language setting. Текущие параметры языка используются для вычисления литералов datetime и smalldatetime в функции секционирования.The current language setting is used to evaluate datetime and smalldatetime literals in the partition function. СреднийMedium
Предложение FOR BROWSE допускается (и не учитывается) в инструкциях INSERT и SELECT INTO.The FOR BROWSE clause is allowed (and ignored) in INSERT and SELECT INTO statements. Предложение FOR BROWSE не допускается в инструкциях INSERT и SELECT INTO.The FOR BROWSE clause is not allowed in INSERT and SELECT INTO statements. СреднийMedium
Полнотекстовые предикаты допускаются в предложении OUTPUT.Full-text predicates are allowed in the OUTPUT clause. Полнотекстовые предикаты не допускаются в предложении OUTPUT.Full-text predicates are not allowed in the OUTPUT clause. НизкийLow
CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST и DROP FULLTEXT STOPLIST не поддерживаются.CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST, and DROP FULLTEXT STOPLIST are not supported. Системный список стоп-слов автоматически связывается с новыми полнотекстовыми индексами.The system stoplist is automatically associated with new full-text indexes. CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST и DROP FULLTEXT STOPLIST поддерживаются.CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST, and DROP FULLTEXT STOPLIST are supported. НизкийLow
MERGE не рассматривается как зарезервированное ключевое слово.MERGE is not enforced as a reserved keyword. MERGE является полностью зарезервированным ключевым словом.MERGE is a fully reserved keyword. Инструкция MERGE поддерживается на обоих уровнях совместимости, 100 и 90.The MERGE statement is supported under both 100 and 90 compatibility levels. НизкийLow
При использовании аргумента <dml_table_source> в инструкции INSERT возникает синтаксическая ошибка.Using the <dml_table_source> argument of the INSERT statement raises a syntax error. Можно собрать результаты предложения OUTPUT во вложенных инструкциях INSERT, UPDATE, DELETE или MERGE и вставить эти результаты в целевую таблицу или представление.You can capture the results of an OUTPUT clause in a nested INSERT, UPDATE, DELETE, or MERGE statement, and insert those results into a target table or view. Это выполняется с помощью аргумента <dml_table_source> инструкции INSERT.This is done using the <dml_table_source> argument of the INSERT statement. НизкийLow
Если не указано предложение NOINDEX, инструкции DBCC CHECKDB и DBCC CHECKTABLE выполняют проверку физической и логической согласованности для одной таблицы или индексированного представления, а также для всех некластеризованных индексов и XML-индексов.Unless NOINDEX is specified, DBCC CHECKDB or DBCC CHECKTABLE performs both physical and logical consistency checks on a single table or indexed view and on all its nonclustered and XML indexes. Пространственные индексы не поддерживаются.Spatial indexes are not supported. Если не указано предложение NOINDEX, инструкции DBCC CHECKDB и DBCC CHECKTABLE выполняют проверку физической и логической согласованности для одной таблицы и всех ее некластеризованных индексов.Unless NOINDEX is specified, DBCC CHECKDB or DBCC CHECKTABLE performs both physical and logical consistency checks on a single table and on all its nonclustered indexes. Однако в XML-индексах, пространственных индексах и индексированных представлениях по умолчанию выполняются только проверки физической согласованности.However, on XML indexes, spatial indexes, and indexed views, only physical consistency checks are performed by default.

Если указан параметр WITH EXTENDED_LOGICAL_CHECKS, выполняются проверки логической согласованности в индексированных представлениях, XML-индексах и пространственных индексах (при их наличии).If WITH EXTENDED_LOGICAL_CHECKS is specified, logical checks are performed on indexed views, XML indexes, and spatial indexes, where present. По умолчанию проверки физической согласованности выполняются раньше, чем проверки логической согласованности.By default, physical consistency checks are performed before the logical consistency checks. Если также указан параметр NOINDEX, выполняются только проверки логической согласованности.If NOINDEX is also specified, only the logical checks are performed.
НизкийLow
Если предложение OUTPUT используется в инструкции DML и при выполнении инструкции возникает ошибка времени выполнения, то завершается вся транзакция и происходит откат.When an OUTPUT clause is used with a data manipulation language (DML) statement and a run-time error occurs during statement execution, the entire transaction is terminated and rolled back. Если предложение OUTPUT используется в инструкции DML и при выполнении инструкции возникает ошибка во время выполнения, дальнейшее поведение системы зависит от параметра SET XACT_ABORT.When an OUTPUT clause is used with a data manipulation language (DML) statement and a run-time error occurs during statement execution, the behavior depends on the SET XACT_ABORT setting. Если параметр SET XACT_ABORT имеет значение OFF, то аварийное прекращение выполнения инструкции из-за ошибки, возникшей при выполнении инструкции DML, в которой используется предложение OUTPUT, приводит к завершению инструкции, но выполнение пакета продолжается и откат транзакции не происходит.If SET XACT_ABORT is OFF, a statement abort error generated by the DML statement using the OUTPUT clause will terminate the statement, but the execution of the batch continues and the transaction is not rolled back. Если параметр SET XACT_ABORT имеет значение ON, то при возникновении любых ошибок во время выполнения, вызванных инструкцией DML, в которой используется предложение OUTPUT, происходит завершение пакета и откат транзакции.If SET XACT_ABORT is ON, all run-time errors generated by the DML statement using the OUTPUT clause will terminate the batch, and the transaction is rolled back. НизкийLow
CUBE и ROLLUP не рассматриваются как зарезервированные ключевые слова.CUBE and ROLLUP are not enforced as reserved keywords. CUBE и ROLLUP являются зарезервированными ключевыми словами в предложении GROUP BY.CUBE and ROLLUP are reserved keywords within the GROUP BY clause. НизкийLow
К элементам типа XML anyType применяется строгая проверка.Strict validation is applied to elements of the XML anyType type. К элементам типа anyType применяется нестрогая проверка.Lax validation is applied to elements of the anyType type. Дополнительные сведения см. в статье Компоненты-шаблоны и проверка содержимого.For more information, see Wildcard Components and Content Validation. НизкийLow
К специальным атрибутам xsi:nil и xsi:type нельзя выполнять запросы или вносить в них изменения с помощью инструкций DML.The special attributes xsi:nil and xsi:type cannot be queried or modified by data manipulation language statements.

Это означает, что выражение /e/@xsi:nil оканчивается неудачей, несмотря на то, что в предложении /e/@* атрибуты xsi:nil и xsi:type пропускаются.This means that /e/@xsi:nil fails while /e/@* ignores the xsi:nil and xsi:type attributes. Однако предложение /e возвращает атрибуты xsi:nil и xsi:type для согласованности с инструкцией SELECT xmlCol, даже если xsi:nil = "false".However, /e returns the xsi:nil and xsi:type attributes for consistency with SELECT xmlCol, even if xsi:nil = "false".
Специальные атрибуты xsi:nil и xsi:type хранятся как обычные атрибуты, и к ним можно выполнять запросы и вносить в них изменения.The special attributes xsi:nil and xsi:type are stored as regular attributes and can be queried and modified.

Например, выполнение запроса SELECT x.query('a/b/@*') возвращает все атрибуты, включая xsi:nil и xsi:type.For example, executing the query SELECT x.query('a/b/@*') returns all attributes including xsi:nil and xsi:type. Чтобы исключить эти типы из запроса, замените @* на @*[namespace-uri(.) != "insert xsi namespace uri", а не (local-name(.) = "type" или local-name(.) ="nil".To exclude these types in the query, replace @* with @*[namespace-uri(.) != "insert xsi namespace uri" and not (local-name(.) = "type" or local-name(.) ="nil".
НизкийLow
Определяемая пользователем функция, которая преобразует строковое значение константы XML в тип SQL ServerSQL Server datetime, отмечается как детерминированная.A user-defined function that converts an XML constant string value to a SQL ServerSQL Server datetime type is marked as deterministic. Определяемая пользователем функция, которая преобразует строковое значение константы XML в тип SQL ServerSQL Server datetime, отмечается как недетерминированная.A user-defined function that converts an XML constant string value to a SQL ServerSQL Server datetime type is marked as non-deterministic. НизкийLow
Объединение XML и типы списков поддерживаются не полностью.The XML union and list types are not fully supported. Объединение и типы списков поддерживаются полностью, включая следующие функциональные возможности.The union and list types are fully supported including the following functionality:

Объединение списковUnion of list

Объединение объединенийUnion of union

Список атомарных типовList of atomic types

Список объединенийList of union
НизкийLow
Проверка правильности параметров SET, требуемых для метода xQuery, не выполняется, если метод содержится в представлении или во встроенной возвращающей табличное значение функции.The SET options required for an xQuery method are not validated when the method is contained in a view or inline table-valued function. Проверка правильности параметров SET, требуемых для метода xQuery, выполняется, если метод содержится в представлении или во встроенной возвращающей табличное значение функции.The SET options required for an xQuery method are validated when the method is contained in a view or inline table-valued function. Если параметры SET метода заданы неправильно, возникает ошибка.An error is raised if the SET options of the method are set incorrectly. НизкийLow
Значения XML-атрибута, которые содержат символы конца строки (символы возврата каретки и перевода строки), не нормализованы согласно стандарту XML.XML attribute values that contain end-of-line characters (carriage return and line feed) are not normalized according to the XML standard. Таким образом, возвращаются оба символа вместо одного символа перевода строки.That is, both characters are returned instead of a single line-feed character. Значения XML-атрибута, которые содержат символы конца строки (символы возврата каретки и перевода строки), нормализованы согласно стандарту XML.XML attribute values that contain end-of-line characters (carriage return and line feed) are normalized according to the XML standard. Таким образом, все символы конца строки во внешних проанализированных сущностях (включая сущность документа), нормализуются на входе, преобразуя двухсимвольные последовательности #xD #xA и символы #xD, за которыми не следует символ #xA, в единственный символ #xA.That is, all line breaks in external parsed entities (including the document entity) are normalized on input by translating both the two-character sequence #xD #xA and any #xD that is not followed by #xA to a single #xA character.

Приложения, в которых используются атрибуты для переноса строковых значений, содержащих символы конца строки, не получают эти символы назад в том виде, в каком они были переданы.Applications that use attributes to transport string values that contain end-of-line characters will not receive these characters back as they are submitted. Чтобы предотвратить выполнение этого процесса нормализации, используйте числовые сущности-символы XML для кодирования всех символов конца строки.To avoid the normalization process, use the XML numeric character entities to encode all end-of-line characters.
НизкийLow
Свойства столбца ROWGUIDCOL и IDENTITY могут быть неправильно именованы как ограничения.The column properties ROWGUIDCOL and IDENTITY can be incorrectly named as a constraint. Например, инструкция CREATE TABLE T (C1 int CONSTRAINT MyConstraint IDENTITY) выполняется, но имя ограничения не сохраняется и не доступно для пользователя.For example the statement CREATE TABLE T (C1 int CONSTRAINT MyConstraint IDENTITY) executes, but the constraint name is not preserved and is not accessible to the user. Свойства столбца ROWGUIDCOL и IDENTITY не могут быть именованы как ограничения.The column properties ROWGUIDCOL and IDENTITY cannot be named as a constraint. Возвращается ошибка 156.Error 156 is returned. НизкийLow
Обновление столбцов с использованием двухстороннего присваивания, такого как UPDATE T1 SET @v = column_name = <expression>, может привести к получению непредвиденных результатов, поскольку активное значение переменной может использоваться в других предложениях, таких как WHERE и ON, во время выполнения инструкции вместо начального значения в инструкции.Updating columns by using a two-way assignment such as UPDATE T1 SET @v = column_name = <expression> can produce unexpected results because the live value of the variable can be used in other clauses such as the WHERE and ON clause during statement execution instead of the statement starting value. Это может стать причиной того, что значения предикатов будут изменяться непредсказуемым образом при переходе от строки к строке.This can cause the meanings of the predicates to change unpredictably on a per-row basis.

Такое поведение применимо, только если уровень совместимости равен 90.This behavior is applicable only when the compatibility level is set to 90.
Обновление столбцов с использованием двухстороннего присваивания приводит к получению ожидаемых результатов, поскольку во время выполнения инструкции происходит доступ только к начальному значению столбца в инструкции.Updating columns by using a two-way assignment produces expected results because only the statement starting value of the column is accessed during statement execution. НизкийLow
См. пример Д, приведенный ниже в разделе с примерами.See example E in the Examples section below. См. пример Е, приведенный ниже в разделе с примерами.See example F in the Examples section below. НизкийLow
В функции ODBC {fn CONVERT()} используется применяемый в языке по умолчанию формат даты.The ODBC function {fn CONVERT()} uses the default date format of the language. Для некоторых языков форматом по умолчанию является ГДМ, что может привести к ошибкам преобразования, если функция CONVERT() применяется в сочетании с другими функциями, такими как {fn CURDATE()}, которые предполагают использование даты в формате ГМД.For some languages, the default format is YDM, which can result in conversion errors when CONVERT() is combined with other functions, such as {fn CURDATE()}, that expect a YMD format. В функции ODBC {fn CONVERT()} используется стиль 121 (независимый от языка формат ГМД) при преобразовании в такие типы данных ODBC, как SQL_TIMESTAMP, SQL_DATE, SQL_TIME, SQLDATE, SQL_TYPE_TIME и SQL_TYPE_TIMESTAMP.The ODBC function {fn CONVERT()} uses style 121 (a language-independent YMD format) when converting to the ODBC data types SQL_TIMESTAMP, SQL_DATE, SQL_TIME, SQLDATE, SQL_TYPE_TIME, and SQL_TYPE_TIMESTAMP. НизкийLow
Для таких встроенных средств работы со значениями даты и времени, как DATEPART, не требуется, чтобы строковые введенные значения были допустимыми литералами даты и времени.Datetime intrinsics such as DATEPART do not require string input values to be valid datetime literals. Например, SELECT DATEPART (year, '2007/05-30') компилируется успешно.For example, SELECT DATEPART (year, '2007/05-30') compiles successfully. Для таких встроенных средств работы со значениями даты и времени, как DATEPART, необходимо, чтобы входные строковые значения были допустимыми литералами даты и времени.Datetime intrinsics such as DATEPART require string input values to be valid datetime literals. Возвращается ошибка 241 при использовании недопустимого литерала даты и времени.Error 241 is returned when an invalid datetime literal is used. НизкийLow

Зарезервированные словаReserved Keywords

Настройка совместимости также определяет ключевые слова, зарезервированные компонентом Компонент Database EngineDatabase Engine.The compatibility setting also determines the keywords that are reserved by the Компонент Database EngineDatabase Engine. В следующей таблице показаны зарезервированные ключевые слова, представленные каждым из уровней совместимости.The following table shows the reserved keywords that are introduced by each of the compatibility levels.

Уровень совместимостиCompatibility level setting Зарезервированные ключевые словаReserved keywords
130130 Подлежит уточнению.To be determined.
120120 Нет.None.
110110 WITHIN GROUP, TRY_CONVERT, SEMANTICKEYPHRASETABLE, SEMANTICSIMILARITYDETAILSTABLE, SEMANTICSIMILARITYTABLEWITHIN GROUP, TRY_CONVERT, SEMANTICKEYPHRASETABLE, SEMANTICSIMILARITYDETAILSTABLE, SEMANTICSIMILARITYTABLE
100100 CUBE, MERGE, ROLLUPCUBE, MERGE, ROLLUP
9090 EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLEEXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE

На данном уровне совместимости зарезервированные ключевые слова включают в себя все ключевые слова, представленные на этом уровне или ниже.At a given compatibility level, the reserved keywords include all of the keywords introduced at or below that level. Таким образом, например, для приложений на уровне 110, все ключевые слова, перечисленные в предыдущей таблице, являются зарезервированными.Thus, for instance, for applications at level 110, all of the keywords listed in the preceding table are reserved. На более низких уровнях совместимости ключевые слова уровня 100 остаются допустимыми именами объектов, но функции языка уровня 110, соответствующие этим ключевым словам, недоступны.At the lower compatibility levels, level-100 keywords remain valid object names, but the level-110 language features corresponding to those keywords are unavailable.

Будучи однажды представленным, ключевое слово остается зарезервированным.Once introduced, a keyword remains reserved. Например, зарезервированное ключевое слово PIVOT, которое было введено на уровне совместимости 90, является также зарезервированным на уровнях 100, 110 и 120.For example, the reserved keyword PIVOT, which was introduced in compatibility level 90, is also reserved in levels 100, 110, and 120.

Если приложение использует идентификатор, зарезервированный в качестве ключевого слова на его уровне совместимости, работа приложения приведет к ошибке.If an application uses an identifier that is reserved as a keyword for its compatibility level, the application will fail. Чтобы обойти эту проблему, заключите идентификатор в квадратные скобки ( [] ) или кавычки ( "" ). Например, чтобы обновить приложение, использующее идентификатор EXTERNAL, до уровня совместимости 90, можно изменить идентификатор на [EXTERNAL] или "EXTERNAL".To work around this, enclose the identifier between either brackets ([]) or quotation marks (""); for example, to upgrade an application that uses the identifier EXTERNAL to compatibility level 90, you could change the identifier to either [EXTERNAL] or "EXTERNAL".

См. дополнительные сведения о зарезервированных ключевых словах.For more information, see Reserved Keywords.

РазрешенияPermissions

Необходимо разрешение ALTER на базу данных.Requires ALTER permission on the database.

ПримерыExamples

A.A. Изменение уровня совместимостиChanging the compatibility level

В следующем примере изменяется уровень совместимости базы данных AdventureWorks2012AdventureWorks2012 до 110, параметру по умолчанию для SQL Server 2012 (11.x)SQL Server 2012 (11.x).The following example changes the compatibility level of the AdventureWorks2012AdventureWorks2012 database to 110, the default for SQL Server 2012 (11.x)SQL Server 2012 (11.x).

ALTER DATABASE AdventureWorks2012
SET COMPATIBILITY_LEVEL = 110;
GO

В следующем примере возвращается уровень совместимости текущей базы данных.The following example returns the compatibility level of the current database.

SELECT name, compatibility_level
FROM sys.databases
WHERE name = db_name();

Б.B. Не учитывается инструкция SET LANGUAGE, за исключением выполнения при уровне совместимости 120.Ignoring the SET LANGUAGE statement except under compatibility level 120

Следующий запрос не учитывает инструкцию SET LANGUAGE, за исключением выполнения на уровне совместимости 120.The following query ignores the SET LANGUAGE statement except under compatibility level 120.

SET DATEFORMAT dmy;
DECLARE @t2 date = '12/5/2011' ;
SET LANGUAGE dutch;
SELECT CONVERT(varchar(11), @t2, 106);

-- Results when the compatibility level is less than 120.
12 May 2011

-- Results when the compatibility level is set to 120).
12 mei 2011

В.C. При уровне совместимости 110 или ниже рекурсивные ссылки в правой части предложения EXCEPT создают бесконечный цикл.For compatibility-level setting of 110 or lower, recursive references on the right-hand side of an EXCEPT clause create an infinite loop

WITH
cte AS (SELECT * FROM (VALUES (1),(2),(3)) v (a)),
r
AS (SELECT a FROM Table1
UNION ALL
(SELECT a FROM Table1 EXCEPT SELECT a FROM r) )
SELECT a
FROM r;

Г.D. Разница между стилями 0 и 121.The difference between styles 0 and 121

Дополнительные сведения о стилях даты и времени см. в описании CAST и CONVERT.For more information about date and time styles, see CAST and CONVERT.

CREATE TABLE t1 (c1 time(7), c2 datetime2);

INSERT t1 (c1,c2) VALUES (GETDATE(), GETDATE());

SELECT CONVERT(nvarchar(16),c1,0) AS TimeStyle0
       ,CONVERT(nvarchar(16),c1,121)AS TimeStyle121
       ,CONVERT(nvarchar(32),c2,0) AS Datetime2Style0
       ,CONVERT(nvarchar(32),c2,121)AS Datetime2Style121
FROM t1;

-- Returns values such as the following.
TimeStyle0       TimeStyle121
Datetime2Style0      Datetime2Style121
---------------- ----------------
-------------------- --------------------------
3:15PM           15:15:35.8100000
Jun  7 2011  3:15PM  2011-06-07 15:15:35.8130000

Д.E. Присваивание переменной — оператор UNION верхнего уровня.Variable assignment - top-level UNION operator

Присваивание значения переменной допускается в инструкции, содержащей оператор UNION верхнего уровня, но возвращает непредвиденные результаты.Variable assignment is allowed in a statement containing a top-level UNION operator, but returns unexpected results. Например, в следующих инструкциях локальной переменной @v присваивается значение столбца BusinessEntityID из объединения двух таблиц.For example, in the following statements, local variable @v is assigned the value of the column BusinessEntityID from the union of two tables. Если инструкция SELECT возвращает более одного значения, переменной присваивается последнее возвращенное значение.By definition, when the SELECT statement returns more than one value, the variable is assigned the last value that is returned. В этом случае переменной правильно присваивается последнее значение, но происходит также возврат результирующего набора инструкции SELECT UNION.In this case, the variable is correctly assigned the last value, however, the result set of the SELECT UNION statement is also returned.

ALTER DATABASE AdventureWorks2012
SET compatibility_level = 110;
GO
USE AdventureWorks2012;
GO
DECLARE @v int;
SELECT @v = BusinessEntityID FROM HumanResources.Employee
UNION ALL
SELECT @v = BusinessEntityID FROM HumanResources.EmployeeAddress;
SELECT @v;

Присваивание значения переменной не допускается в инструкции, содержащей оператор UNION верхнего уровня.Variable assignment is not allowed in a statement containing a top-level UNION operator. Возвращается ошибка 10734.Error 10734 is returned. Чтобы устранить эту ошибку, перепишите запрос, как показано в следующем примере.To resolve the error, rewrite the query as shown in the following example.

DECLARE @v int;
SELECT @v = BusinessEntityID FROM
    (SELECT BusinessEntityID FROM HumanResources.Employee
     UNION ALL
     SELECT BusinessEntityID FROM HumanResources.EmployeeAddress) AS Test;
SELECT @v;

См. также:See Also

Сертификация на совместимость Compatibility Certification
ALTER DATABASE ALTER DATABASE
Зарезервированные ключевые слова Reserved Keywords
CREATE DATABASE CREATE DATABASE
DATABASEPROPERTYEX DATABASEPROPERTYEX
sys.databases sys.databases
sys.database_files sys.database_files
Просмотр или изменение уровня совместимости базы данных View or Change the Compatibility Level of a Database
Изменение режима совместимости базы данных и использование хранилища запросов Change the Database Compatibility Mode and use the Query Store
Обновление баз данных с помощью помощника по настройке запросовUpgrading Databases by using the Query Tuning Assistant