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


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

Applies to:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Определяет поведение обработки запросов и Transact-SQL для обеспечения совместимости с указанной версией ядра SQL. For other ALTER DATABASE options, see ALTER DATABASE.

Дополнительные сведения о соглашениях о синтаксисе см. в статье Соглашения о синтаксисе в Transact-SQL.

Syntax

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

Arguments

database_name

Имя изменяемой базы данных.

COMPATIBILITY_LEVEL { 170 | 160 | 150 | 140 | 130 | 120 | 110 | 100 | 90 | 80 }

Версия SQL Server, с которой должна быть совместима база данных. Можно настроить следующие значения уровня совместимости (не все версии поддерживают все перечисленные в списке выше уровни совместимости):

Product Версия ядра СУБД Назначение уровня совместимости по умолчанию Поддерживаемые значения уровня совместимости
База данных SQL Azure 17 170 170, 160, 150, 140, 130, 120, 110, 100
Управляемый экземпляр SQL Azure 16 150 160, 150, 140, 130, 120, 110, 100
Предварительная версия SQL Server 2025 (17.x) 17 170 170, 160, 150, 140, 130, 120, 110, 100
SQL Server 2022 (16.x) 16 160 160, 150, 140, 130, 120, 110, 100
SQL Server 2019 (15.x) 15 150 150, 140, 130, 120, 110, 100
SQL Server 2017 (14.x) 14 140 140, 130, 120, 110, 100
SQL Server 2016 (13.x) 13 130 130, 120, 110, 100
SQL Server 2014 (12.x) 12 120 120, 110, 100
SQL Server 2012 (11.x) 11 110 110, 100, 90
SQL Server 2008 R2 (10.50.x) 10.5 100 100, 90, 80
SQL Server 2008 (10.0.x) 10 100 100, 90, 80
SQL Server 2005 (9.x) 9 90 90, 80
SQL Server 2000 (8.x) 8 80 80

Important

Номера версий ядра СУБД для SQL Server и Базы данных SQL Azure не сопоставимы друг с другом, и скорее являются внутренними номерами сборки для этих отдельных продуктов. Ядро СУБД для Базы данных SQL Azure основано на той же базе кода, что и ядро СУБД SQL Server. Что важнее всего, ядро СУБД в базе данных SQL Azure всегда имеет самые новые части ядра СУБД SQL. Версия 12 базы данных SQL Azure более новая, чем версия 15 SQL Server.

Рекомендации по обновлению уровня совместимости базы данных

Рекомендуемый рабочий процесс для повышения уровня совместимости см. в разделе Сохранение стабильности производительности при обновлении до более новой версии SQL Server. Кроме того, дополнительные сведения об обновлении уровня совместимости базы данных см. в разделе "Обновление баз данных" с помощью помощника по настройке запросов.

Remarks

Для всех установок SQL Server уровень совместимости по умолчанию связан с версией ядро СУБД. Новые базы данных устанавливаются на этот уровень, если model база данных не имеет более низкого уровня совместимости. Для баз данных, подключенных или восстановленных из любой более ранней версии SQL Server, база данных сохраняет существующий уровень совместимости, если это не менее допустимо для этого экземпляра SQL Server. При перемещении базы данных с уровнем совместимости ниже заданного ядром СУБД уровня, автоматически устанавливается минимальный допустимый уровень совместимости. Это относится и к системным, и к пользовательским базам данных.

Для SQL Server 2017 (14.x) ожидается следующее поведение при присоединении или восстановлении базы данных и после обновления на месте:

  • Если уровень совместимости пользовательской базы данных до обновления был 100 или выше, после обновления он останется таким же.
  • Если уровень совместимости пользовательской базы данных был 90 до обновления, в обновленной базе данных устанавливается уровень совместимости 100, который является самым низким поддерживаемым уровнем совместимости в SQL Server 2017 (14.x).
  • Уровни tempdbсовместимости баз данных , modelmsdbи ресурсов задаются на уровне совместимости по умолчанию для заданной версии ядро СУБД.
  • Системная база данных master сохраняет уровень совместимости, который она имела до обновления. Это не повлияет на поведение пользовательской базы данных.

Для существующих баз данных, работающих на более низких уровнях совместимости, если приложению не нужно использовать улучшения, доступные только на более высоком уровне совместимости базы данных, это допустимый подход для поддержания предыдущего уровня совместимости базы данных. Для новых работ разработки или если существующее приложение требует использования новых функций, таких как интеллектуальная обработка запросов в базах данных SQL и некоторые новые функции Transact-SQL, планируйте обновление уровня совместимости базы данных до последней доступной. Дополнительные сведения см. в разделе Уровни совместимости и обновления ядра СУБД.

Note

Если нет пользовательских объектов и зависимостей, обычно это безопасно для обновления до уровня совместимости по умолчанию. Дополнительные сведения см. в статье Рекомендации — база данных master.

Измените уровень совместимости базы данных с помощью инструкции ALTER DATABASE. Новый параметр уровня совместимости для базы данных вступит в силу после выдачи USE <database> или обработки нового имени входа в этой базе данных в качестве контекста базы данных по умолчанию.

To view the current compatibility level of a database, query the compatibility_level column in the sys.databases catalog view.

A distribution database that was created in an earlier version of SQL Server and is upgraded to SQL Server 2016 (13.x) RTM or Service Pack 1 has a compatibility level of 90, which isn't supported for other databases. Это не влияет на функциональные возможности репликации. Обновление до более поздних пакетов обновления и версий SQL Server приведет к увеличению уровня совместимости базы данных распространителя, чтобы она соответствовала master базе данных.

To use database compatibility level 120 or higher for a database overall, but opt-in to the cardinality estimation model of 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 Azure

Уровень совместимости по умолчанию — 170 для вновь созданных баз данных в базе данных SQL Azure и базе данных SQL в Microsoft Fabric.

Уровень совместимости по умолчанию — 150 для вновь созданных баз данных в политике обновления SQL Server 2022 предложения Управляемого экземпляра SQL Azure.

Уровень совместимости по умолчанию — 170 для вновь созданных баз данных в политике обновления Always-up-to-date предложения управляемого экземпляра SQL Azure.

Корпорация Майкрософт не обновляет уровень совместимости базы данных для существующих баз данных автоматически. Это до клиентов, чтобы сделать по своему усмотрению.

Корпорация Майкрософт настоятельно рекомендует клиентам выполнять обновление до последнего уровня совместимости, чтобы использовать последние улучшения оптимизации запросов. Советы по оценке различий производительности наиболее важных запросов между двумя разными уровнями совместимости в База данных SQL Azure см. в разделе "Улучшенная производительность запросов с уровнем совместимости 130" в База данных SQL Azure. В этой статье описывается уровень совместимости 130 и SQL Server, но при обновлении до уровня 140 или выше для SQL Server и базы данных SQL Azure применяется тот же способ.

Не все функции, которые зависят от уровня совместимости, поддерживаются в База данных SQL Azure.

Поиск текущего уровня совместимости

To determine the current compatibility level, query the compatibility_level column of sys.databases.

SELECT [name],
       compatibility_level
FROM sys.databases;

Чтобы определить версию подключенного ядро СУБД, выполните следующий запрос.

SELECT SERVERPROPERTY('ProductVersion');

Уровни совместимости и обновления ядра СУБД

Уровень совместимости базы данных — это полезное средство для модернизации базы данных. Оно позволяет обновлять ядро СУБД SQL Server, сохраняя функциональное состояние подключенных приложений, не изменяя уровень совместимости до обновления базы данных. Это означает, что можно обновить более раннюю версию SQL Server (например, SQL Server 2008 (10.0.x)) до SQL Server или База данных SQL Azure (включая Управляемый экземпляр SQL Azure) без изменений приложения (за исключением подключения к базе данных). For more information, see Compatibility certification.

Если приложению не нужно использовать улучшения, доступные только на более высоком уровне совместимости базы данных, это допустимый подход к обновлению ядра СУБД SQL Server и поддержанию предыдущего уровня совместимости базы данных. For more information on using compatibility level for backward compatibility, see Compatibility certification.

Уровни совместимости и хранимые процедуры

При выполнении хранимой процедуры используется текущий уровень совместимости базы данных, в котором она была определена. Когда настройка совместимости базы данных подвергается изменению, все хранимые процедуры этой базы данных автоматически перекомпилируются соответствующим образом.

Использование уровня совместимости для обратной совместимости

Параметр уровень совместимости базы данных обеспечивает обратную совместимость с предыдущими версиями SQL Server в плане поведения Transact-SQL и оптимизации запросов только для указанной базы данных, а не всего сервера.

Начиная с режима совместимости 130 новые возможности и исправления, влияющие на план запроса, намеренно добавлены только к новому режиму совместимости. Это сделано для того, чтобы свести к минимуму риск во время обновления, связанный со снижением производительности из-за изменения плана определяемого новым поведением оптимизации запросов.

На стороне приложения используйте более низкий уровень совместимости в качестве более безопасного варианта в процессе устранения проблем, возникших из-за различий в поведении между версиями, которые определяются соответствующей настройкой уровня совместимости. Цель по-прежнему заключается в обновлении до последнего уровня совместимости в определенный момент времени, чтобы наследовать некоторые из новых функций, таких как интеллектуальная обработка запросов в базах данных SQL, но сделать это в управляемом режиме.

Дополнительные сведения, включая рекомендуемый рабочий процесс для обновления уровня совместимости базы данных, см. в рекомендациях по обновлению уровня совместимости базы данных.

  • Discontinued functionality introduced in a given SQL Server version is not protected by compatibility level. Это относится к функциям, которые были удалены из ядро СУБД SQL Server. Например, FASTFIRSTROW указание было прекращено в SQL Server 2012 (11.x) и заменено указанием OPTION (FAST n ) . Установка уровня совместимости базы данных на 110 не приведет к восстановлению прекращенного указания. Дополнительные сведения о отключенных функциях см. в разделе "Прекращенная функция ядра СУБД" в SQL Server.

  • Breaking changes introduced in a given SQL Server version might not be protected by compatibility level. Это относится к изменениям поведения между версиями SQL Server ядро СУБД. Поведение Transact-SQL обычно зависит от уровня совместимости. However, changed or removed system objects are not protected by compatibility level.

    An example of a breaking change protected by compatibility level is an implicit conversion from datetime to datetime2 data types. При уровне совместимости базы данных 130 эти преобразования демонстрируют повышенную точность благодаря учету долей миллисекунд. В результате преобразования дают иные значения. Чтобы восстановить прежнее поведение преобразования, задайте уровень совместимости базы данных 120 или ниже.

    Examples of breaking changes not protected by compatibility level are:

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

For all installations of SQL Server, the default compatibility level is associated with the version of the Database Engine, as seen in this table. Для новых задач разработки всегда планируйте сертификацию приложений на базе новейшего уровня совместимости базы данных.

Новый синтаксис Transact-SQL не используется на уровне совместимости базы данных, за исключением случаев, когда они могут нарушить существующие приложения, создав конфликт с кодом Transact-SQL пользователя. Исключения, касающиеся различий между конкретными уровнями совместимости, описаны в следующих разделах этой статьи.

Уровень совместимости базы данных также обеспечивает обратную совместимость с предыдущими версиями SQL Server, так как базы данных, подключенные или восстановленные из любой предыдущей версии SQL Server, сохраняют имеющийся уровень совместимости (если он соответствует минимально допустимому уровню совместимости или превышает его). Это обсуждалось в разделе Использование уровня совместимости для обеспечения обратной совместимости этой статьи.

Начиная с уровня совместимости базы данных 130 все новые исправления и возможности, влияющие на планы запросов, были добавлены только в последний доступный уровень совместимости, также называемый уровнем совместимости по умолчанию. Это сделано для того, чтобы свести к минимуму риск во время обновления, связанный со снижением производительности из-за изменения плана, определяемого новым поведением оптимизации запросов.

Основные изменения, влияющие на план, добавляются только на уровень совместимости по умолчанию новой версии ядро СУБД:

  1. Исправления оптимизатора запросов, выпущенные для предыдущих версий SQL Server под флагом трассировки 4199, автоматически включены на уровне совместимости по умолчанию новой версии SQL Server.

    Applies to: SQL Server (Starting with version SQL Server 2016 (13.x)), Azure SQL Database.

    Например, при выпуске SQL Server 2016 (13.x) все исправления оптимизатора запросов, выпущенные для предыдущих версий SQL Server (и соответствующие уровни совместимости 100–120) автоматически включены для баз данных, использующих уровень совместимости ПО умолчанию SQL Server 2016 (13.x). Необходимо явно включить только исправления оптимизатора запросов после выпуска RTM.

    Чтобы включить исправления оптимизатора запросов, можно использовать следующие методы:

    Позже при выпуске SQL Server 2017 (14.x) все исправления оптимизатора запросов, выпущенные после того, как RTM SQL Server 2016 (13.x) автоматически включено для баз данных с помощью уровня совместимости по умолчанию SQL Server 2017 (14.x). Это накопительное поведение, которое включает также исправления всех предыдущих версий. Необходимо также явно включить только исправления оптимизатора запросов после выпуска RTM.

    В следующей таблице описывается это поведение:

    Версия ядра СУБД Уровень совместимости базы данных TF 4199 Изменения в оптимизаторе запросов из всех предыдущих уровней совместимости базы данных Изменения качества обслуживания для версии после RTM (DE)
    13 (SQL Server 2016 (13.x)) 100–120


    130
    Off
    On
    Off
    On
    Disabled
    Enabled
    Enabled
    Enabled
    Disabled
    Enabled
    Disabled
    Enabled
    14 (SQL Server 2017 (14.x)) 100–120


    130
    140
    Off
    On
    Off
    On
    Off
    On
    Disabled
    Enabled
    Enabled
    Enabled
    Enabled
    Enabled
    Disabled
    Enabled
    Disabled
    Enabled
    Disabled
    Enabled
    15 (SQL Server 2019 (15.x)) и (База данных SQL Azure) 100–120


    130–140
    150
    Off
    On
    Off
    On
    Off
    On
    Disabled
    Enabled
    Enabled
    Enabled
    Enabled
    Enabled
    Disabled
    Enabled
    Disabled
    Enabled
    Disabled
    Enabled
    16 (SQL Server 2022 (16.x)) и (База данных SQL Azure) 100–120


    От 130 до 150
    160
    Off
    On
    Off
    On
    Off
    On
    Disabled
    Enabled
    Enabled
    Enabled
    Enabled
    Enabled
    Disabled
    Enabled
    Disabled
    Enabled
    Disabled
    Enabled
    17 (предварительная версия SQL Server 2025 (17.x), База данных SQL Azure и база данных SQL в Microsoft Fabric) 100–120


    От 130 до 160
    170
    Off
    On
    Off
    On
    Off
    On
    Disabled
    Enabled
    Enabled
    Enabled
    Enabled
    Enabled
    Disabled
    Enabled
    Disabled
    Enabled
    Disabled
    Enabled

    Оптимизатор запросов исправляет ошибки, связанные с неправильными результатами или ошибками нарушения доступа, не защищены флагом трассировки 4199. Эти исправления не считаются необязательными.

  2. Изменения оценки кратности , выпущенные в SQL Server, Базе данных SQL Azure и базе данных SQL в Microsoft Fabric, включены только на уровне совместимости по умолчанию новой версии ядра СУБД, но не на предыдущих уровнях совместимости.

    Например, при выпуске SQL Server 2016 (13.x) изменения в процессе оценки кратности были доступны только для баз данных с использованием уровня совместимости по умолчанию SQL Server 2016 (13.x). Предыдущие уровни совместимости сохранили поведение оценки кратности, доступное до SQL Server 2016 (13.x).

    Позже, когда sql Server 2017 (14.x) был выпущен, новые изменения в процессе оценки кратности были доступны только для баз данных с использованием уровня совместимости по умолчанию SQL Server 2017 (14.x). Уровень совместимости базы данных 130 не изменяет поведение оценки кратности SQL Server 2016 (13.x).

    В следующей таблице описывается это поведение:

    Версия ядра СУБД Уровень совместимости базы данных Изменения оценки кратности в новой версии
    13 (SQL Server 2016 (13.x)) < 130
    130
    Disabled
    Enabled
    14 (SQL Server 2017 (14.x))1 < 140
    140
    Disabled
    Enabled
    15 (SQL Server 2019 (15.x))1 < 150
    150
    Disabled
    Enabled
    16 (SQL Server 2022 (16.x))1 < 160
    160
    Disabled
    Enabled
    17 (SQL Server 2025 (17.x) Preview)1 < 170
    170
    Disabled
    Enabled

    1 Also applicable to Azure SQL Database and SQL database in Microsoft Fabric.

Другие различия между конкретными уровнями совместимости доступны в следующих разделах этой статьи.

Различия между уровнем совместимости 160 и уровнем 170

В этом разделе описывается новое поведение, введенное на уровне совместимости 170.

Параметр уровня совместимости 160 или ниже Параметр уровня совместимости 170
Чтобы защитить материал ключа симметричного ключа, главный ключ базы данных и главный ключ службы, SQL Server и AZURE SQL хранят материалы ключа в зашифрованной форме. Шифрование использует режим заполнения PKCS#1 версии 1.5. Чтобы защитить материал ключа симметричного ключа, главный ключ базы данных и главный ключ службы, SQL Server и AZURE SQL хранят материалы ключа в зашифрованной форме. Шифрование использует режим заполнения OAEP-256. В dm_database_encryption_keys будет отображаться CERTIFICATE_OAEP_256 encryptor_type вместо CERTIFICATE.
Регулярные выражения можно использовать для сопоставления сложных шаблонов и управления данными в базе данных SQL Server и Базе данных SQL Azure. Добавлена поддержка регулярных выражений в T-SQL. Некоторые функции регулярного выражения недоступны во всех уровнях совместимости базы данных. Дополнительные сведения см. в предварительной версии функций регулярных выражений. Функции регулярного выражения, такие как REGEXP_LIKE, REGEXP_MATCHESи REGEXP_SPLIT_TO_TABLE были введены для включения сопоставления шаблонов, извлечения и разделения непосредственно в T-SQL.
Добавлена возможность создания внедрения ИИ (векторных массивов) из текстовых выражений. For more information, see AI functions. AI_GENERATE_CHUNKS Представляет функцию, которая позволяет фрагментирование текстовых входных данных для потребления модели ИИ, улучшение интеграции со службами ИИ.
Traditionally, the Database Engine protects DML statements from the Halloween problem by introducing a Spool operator in the query plan, or by taking advantage of another blocking operator already present in the plan, such as a Sort or a Hash Match. Оптимизированная защита Хэллоуина удаляет ненужные операторы спула и улучшает производительность запросов во время операций DML, где требуется защита Хэллоуина.
У параметризованных запросов может быть несколько кэшированных планов запросов для разных категорий селективности параметра. Оптимизация плана с учетом параметров включена по умолчанию в уровне совместимости 160 только для выбора запросов. Если оптимизация плана с учетом параметров работает на уровне совместимости 170, поддержка запросов DML, а также поддержка также tempdb доступна
Параметризованные запросы, имеющие необязательные параметры, могут страдать от неоптимальных планов из-за сниффинга параметров. Оптимизация плана запросов для необязательных параметров, повышая производительность, создавая более подходящие планы для значений NULL и не NULL.

Различия между уровнями совместимости 150 и 160

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 160.

Уровень совместимости 150 и ниже Уровень совместимости 160
У параметризованных запросов есть один план запроса на основе параметров, используемых для первого выполнения. Только один план запроса кэшируется и используется для всех значений параметров. Это может привести к тому, что план запроса будет неэффективным для некоторых значений параметра (план с учетом параметров). У параметризованных запросов может быть несколько кэшированных планов запросов для разных категорий селективности параметра. Оптимизация плана с учетом параметров включена по умолчанию на уровне совместимости 160. For more information, see PSP Optimization.
Оценка кратности использует только один набор предположений модели по умолчанию о базовом распределении данных и шаблонах использования для всех баз данных и запросов. Единственным способом изменения или корректировки любого из этих предположений является то, когда пользователь выполняет ручной процесс, чтобы явно указать, какие предположения модели следует использовать с помощью подсказок запроса. В эту модель по умолчанию нельзя внести внутреннюю корректировку после создания плана запроса. Оценка кратности начинается с набора предположений модели по умолчанию о базовых шаблонах распределения данных и использования, но после некоторых выполнений для данного запроса ядро СУБД узнает, какие различные наборы предположений модели могут дать более точные оценки, и поэтому корректирует предположения, используемые для лучшего соответствия запрашиваемому набору данных. Обратная связь по CE включена по умолчанию на уровне совместимости 160. Дополнительные сведения см. в разделе оценки кратности (CE).
Ядро СУБД не пытается автоматически определить оптимальную степень параллелизма. Сведения о ручном управлении максимальной степенью параллелизма (MAXDOP) на уровне экземпляра, базы данных, запроса или рабочей нагрузки см. в разделе "Конфигурация сервера": максимальная степень параллелизма Обратная связь по степени параллелизма (DOP) повышает производительность запросов, определяя неэффективность параллелизма для повторяющихся запросов на основе затраченного времени и ожиданий. Если использование параллелизма считается неэффективным, обратная связь DOP снижает DOP от настроенного ранее значения для следующего выполнения запроса и проверяет, помогло ли это. Обратная связь DOP по умолчанию не включена. Чтобы включить обратную связь по DOP, включите конфигурацию области базы данных DOP_FEEDBACK в базе данных. Для получения дополнительной информации см. Обратная связь по степени параллелизма (DOP).

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

В этом разделе описываются новые возможности, обусловленные появлением уровня совместимости 150.

Уровень совместимости 140 и ниже Уровень совместимости 150
Реляционные хранилища данных и аналитические рабочие нагрузки могут не использовать индексы columnstore из-за нехватки поддержки поставщиков или других ограничений. Без индексов columnstore эти рабочие нагрузки не могут воспользоваться режимом выполнения пакетной службы. Пакетный режим выполнения теперь доступен для аналитических рабочих нагрузок без необходимости использовать индексы columnstore. Дополнительные сведения см. в разделе Пакетный режим для данных rowstore.
Запросы в режиме строк, запрашивающие недостаточно размеров предоставления памяти, которые приводят к утечке на диск, могут продолжать возникать проблемы при последовательных выполнении. Запросы в режиме строк, запрашивающие недостаточно размеров предоставления памяти, которые приводят к утечке на диск, могут повысить производительность при последовательных выполнениях. Дополнительные сведения см. в разделе Обратная связь по временно предоставляемому буферу памяти в построчном режиме.
Запросы в режиме строк, запрашивающие чрезмерный размер предоставления памяти, которые приводят к проблемам параллелизма, могут по-прежнему иметь проблемы с последовательными выполнением. Запросы в режиме строк, запрашивающие чрезмерный размер предоставления памяти, что приводит к проблемам параллелизма, возможно, улучшило параллелизм при последовательных выполнениях. Дополнительные сведения см. в разделе Обратная связь по временно предоставляемому буферу памяти в построчном режиме.
Запросы, ссылающиеся на скалярные пользовательские функции T-SQL, будут применять итеративный вызов, сокращать издержки и предусматривать принудительное последовательное выполнение. Скалярные пользовательские функции T-SQL преобразуются в эквивалентные реляционные выражения, которые "встраиваются" в вызывающий запрос, что часто приводит к существенному повышению производительности. Дополнительные сведения см. в разделе Встраивание скалярных пользовательских функций.
Табличные переменные используют фиксированную оценку для оценки кратности. Если фактическое число строк значительно больше оценочного значения, может наблюдаться снижение производительности нисходящих операций. Теперь планируется использовать фактическую кратность табличной переменной, обнаруженную при первой компиляции, вместо фиксированной оценки. Дополнительные сведения см. в разделе Отложенная компиляция табличных переменных.

Дополнительные сведения о функциях обработки запросов, доступных на уровне 150 совместимости базы данных, см. в статьях Новые возможности в SQL Server 2019 и Интеллектуальная обработка запросов в базах данных SQL.

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

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 140.

Уровень совместимости 130 и ниже Уровень совместимости 140
При оценке кратности для инструкций, ссылающихся на функции с табличным значением с несколькими инструкциями, используется предположение фиксированной строки. При оценке кратности для соответствующих инструкций, ссылающихся на функции с табличным значением с несколькими инструкциями, будет использоваться фактическая кратность из выходных данных функции. This is enabled via interleaved execution for multi-statement table-valued functions.
Запросы в пакетном режиме, запрашивающие недостаточно размеров предоставления памяти, которые приводят к утечке на диск, могут продолжать возникать проблемы с последовательными выполнением. Запросы в пакетном режиме, запрашивающие недостаточно размеров предоставления памяти, которые приводят к переливу на диск, могут повысить производительность при последовательных выполнении. Этот возможно благодаря обратной связи по временно предоставляемому буферу памяти в пакетном режиме, которая обновляет размер временно предоставляемого буфера кэшированного плана, если для операторов пакетного режима произошел перенос.
Запросы в пакетном режиме, запрашивающие чрезмерный размер предоставления памяти, что приводит к проблемам с параллелизмом, может по-прежнему иметь проблемы с последовательными выполнением. Запросы в пакетном режиме, запрашивающие чрезмерный размер предоставления памяти, которые приводят к проблемам параллелизма, могут повысить параллелизм при последовательных выполнении. Этот возможно благодаря обратной связи по временно предоставляемому буферу памяти в пакетном режиме, которая обновляет размер временно предоставляемого буфера кэшированного плана, если был запрошен слишком большой объем.
Запросы в пакетном режиме, содержащие операторы соединения, подходят для трех алгоритмов физического соединения, включая вложенный цикл, хэш-соединение и соединение слиянием. Если оценки кратности неверны для входных данных соединения, может быть выбран недопустимый алгоритм соединения. Если это произойдет, производительность будет страдать, и алгоритм несоответствуемого соединения будет использоваться до тех пор, пока кэшированный план не будет перекомпилирован. There's an additional join operator called adaptive join. Если для входных данных внешнего соединения сборки неверны оценки кратности, может быть выбран недопустимый алгоритм соединения. Если это происходит, и инструкция имеет право на адаптивное соединение, вложенный цикл будет использоваться для небольших входных данных соединения, а хэш-соединение будет использоваться для больших входных данных соединения динамически без необходимости повторной компиляции.
Простейшие планы, ссылающиеся на индексы Columnstore, не подходят для выполнения в пакетном режиме. Простейший план, ссылающийся на индексы columnstore, будет заменен на план, подходящий для выполнения в пакетном режиме.
Оператор UDX sp_execute_external_script может выполняться только в режиме строки. Оператор UDX sp_execute_external_script может выполняться в пакетном режиме.
Функции с табличным значением для нескольких операторов (TVFs) не имеют чередующегося выполнения Выполнение с чередованием для функций с табличным значением с несколькими инструкциями для повышения качества плана.

Исправления, которые включались флагом трассировки 4199 в версиях SQL Server до SQL Server 2017, теперь включены по умолчанию. С режимом совместимости 140. Флаг трассировки 4199 по-прежнему можно использовать для новых исправлений оптимизатора запросов, выпущенных после SQL Server 2017. Дополнительные сведения о флаге трассировки 4199 см. в разделе Флаг трассировки 4199.

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

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 130.

Уровень совместимости 120 и ниже Уровень совместимости 130
Оператор INSERT in a INSERT-SELECT single-threaded. Оператор INSERT в инструкции INSERT-SELECT имеет несколько потоков или может иметь параллельный план.
Запросы в таблицах, оптимизированных для памяти, выполняются в одном потоке. Запросы в таблицах, оптимизированных для памяти, теперь могут иметь параллельные планы.
Представлен средство оценки кратности SQL 2014 CardinalityEstimationModelVersion="120" Дальнейшие улучшения оценки кратности (CE) с моделью оценки кратности 130, которая отображается из плана запроса. CardinalityEstimationModelVersion="130"
Изменения пакетного режима и режима строки в индексах columnstore
  • Сортировки по таблице с индексом Columnstore находятся в режиме строки
  • Оконные агрегатные функции выполняются в режиме строки, например LAG или LEAD
  • Запросы к таблицам Columnstore с несколькими отдельными предложениями, выполняемыми в режиме строки
  • Запросы, выполняемые в MAXDOP 1 режиме строк или с последовательным планом, выполняемым в режиме строки
Изменения пакетного режима и режима строки в индексах columnstore
  • Сортировки по таблице с индексом Columnstore теперь находятся в пакетном режиме
  • Оконные агрегатные функции теперь выполняются в пакетном режиме, например LAG или LEAD
  • Запросы к таблицам Columnstore с несколькими отдельными предложениями работают в пакетном режиме
  • Запросы, выполняемые в MAXDOP 1 режиме пакетной службы или с последовательным планом, выполняются в пакетном режиме
Статистика может обновляться автоматически. Логика, которая автоматически обновляет статистику, более агрессивна для больших таблиц. На практике это должно снизить число случаев, когда у клиентов возникали проблемы с производительностью при выполнении частых запросов к недавно вставленным строкам, если статистика не обновлялась и не получала эти значения.
Трассировка 2371 по умолчанию используется OFF в SQL Server 2014 (12.x). Флаг трассировки 2371 по умолчанию используется ON в SQL Server 2016 (13.x). Флаг трассировки 2371 дает средству автоматического обновления статистики инструкции делать выборку подмножества строк меньшего размера, но более эффективным образом, если в таблице очень много строк.

Одно из улучшений — включение в выборку большего количества строк, которые были вставлены недавно.

Еще одно улучшение — выполнение запросов во время обновления статистики, без блокировки запроса.
На уровне 120 выборка статистики осуществляется одним потоком. На уровне 130 выборка статистики осуществляется несколькими потоками (параллельный процесс).
Максимальное значение — 253 входящих внешних ключа. На одну таблицу может ссылаться до 10 000 входящих внешних ключей или аналогичных элементов. Ограничения см. в разделе "Создание связей внешнего ключа".
Нерекомендуемые хэш-алгоритмы MD2, MD4, MD5, SHA и SHA1 разрешены. Допускаются только хэш-алгоритмы SHA2_256 и SHA2_512.
SQL Server 2016 (13.x) включает улучшения в некоторых преобразованиях типов данных и некоторых (в основном редких) операциях. Дополнительные сведения см. в статье об улучшениях SQL Server и Базы данных SQL Azure при обработке некоторых типов данных и необычных операций.
Функция STRING_SPLIT недоступна. Функция STRING_SPLIT доступна при уровне совместимости 130 или выше. Если уровень совместимости базы данных ниже 130, SQL Server не сможет найти и выполнить функцию STRING_SPLIT.

Исправления, которые находились под флагом трассировки 4199 в более ранних версиях SQL Server до SQL Server 2016 (13.x), теперь включены по умолчанию. С режимом совместимости 130. Флаг трассировки 4199 по-прежнему применим для новых исправлений оптимизатора запросов, выпущенных после SQL Server 2016 (13.x). Чтобы использовать старый оптимизатор запросов в База данных SQL необходимо выбрать уровень совместимости 110. Дополнительные сведения о флаге трассировки 4199 см. в разделе Флаг трассировки 4199.

Различия между уровнем 120 и более низкими уровнями совместимости

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 120.

Уровень совместимости 110 и ниже Уровень совместимости 120
Используется старый оптимизатор запросов. SQL Server 2014 (12.x) включает значительные улучшения компонента, который создает и оптимизирует планы запросов. Эта новая функция оптимизатора запросов зависит от использования уровня совместимости базы данных 120. Новые приложения базы данных необходимо разрабатывать с использованием уровня совместимости базы данных 120, чтобы воспользоваться этими усовершенствованиями. Приложения, перенесенные из более ранних версий SQL Server, должны быть тщательно проверены, чтобы убедиться, что хорошая производительность поддерживается или улучшается. Если производительность снизилась, можно задать уровень совместимости базы данных равным 110 или предыдущему значению для использования методологии оптимизатора запросов из прежних версий.

На уровне совместимости базы данных 120 используется новый механизм оценки количества элементов, который настроен для современных рабочих нагрузок, связанных с хранением данных и OLTP. Before setting database compatibility level to 110 because of performance issues, see the recommendations in the Query Plans section of What's new in SQL Server 2016.
In compatibility levels lower than 120, the language setting is ignored when converting a date value to a string value. This behavior is specific only to the date type. See example B in the Examples section. The language setting isn't ignored when converting a date value to a string value.
Рекурсивные ссылки в правой части предложения EXCEPT создают бесконечный цикл. Example C in the Examples section demonstrates this behavior. Рекурсивные ссылки в EXCEPT предложении создают ошибку в соответствии со стандартом ANSI SQL.
Рекурсивное обобщенное табличное выражение допускает повторяющиеся имена столбцов. В рекурсивных CTE повторяющиеся имена столбцов не допускаются.
Отключенные триггеры активируются при их изменении. Изменение триггера не меняет состояние триггера (отключен или включен).
Предложение OUTPUT INTO таблицы игнорирует IDENTITY_INSERT SETTING = OFF и позволяет вставлять явные значения. Не удается вставить явные значения для столбца удостоверения в таблице, если IDENTITY_INSERT задано значение OFF.
Если выбрано частичное включение базы данных, проверка поля $action в предложении OUTPUT инструкции MERGE может вернуть ошибку параметров сортировки. Параметры сортировки значений, возвращаемых предложением $action инструкции MERGE, — это параметры сортировки базы данных, а не сервера. Ошибка конфликтующих параметров сортировки не возвращается.
Инструкция SELECT INTO всегда создает однопоточную операцию вставки. Инструкция SELECT INTO может создать параллельную операцию вставки. При вставке большого числа строк параллельная операция может увеличить производительность.

Различия между более низкими уровнями совместимости и уровнями 100 и 110

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 110. Этот раздел также относится к уровням совместимости выше 110.

Уровень совместимости 100 и ниже Уровень совместимости не ниже 110
Объекты базы данных среды CLR выполняются в среде CLR версии 4. Однако некоторые из особенностей поведения, изменившиеся в версии 4 среды CLR, не используются. Дополнительные сведения см. в статье "Новые возможности интеграции среды CLR"? Объекты базы данных среды CLR выполняются в среде CLR версии 4.
The XQuery functions string-length and substring count each surrogate as two characters. The XQuery functions string-length and substring count each surrogate as one character.
PIVOT можно использовать в запросах рекурсивного обобщенного табличного выражения. Однако при наличии нескольких строк в группировании запрос возвращает неверные результаты. PIVOT нельзя использовать в запросах рекурсивного обобщенного табличного выражения (CTE). Возвращается ошибка.
Алгоритм RC4 поддерживается только в целях обратной совместимости. Когда база данных имеет уровень совместимости 90 или 100, новые материалы могут шифроваться только с помощью алгоритмов RC4 или RC4_128. (Не рекомендуется.) В SQL Server 2012 (11.x) материал, зашифрованный с помощью RC4 или RC4_128, можно расшифровать на любом уровне совместимости. Новые материалы нельзя шифровать с помощью RC4 или RC4_128. Используйте вместо этого более новые алгоритмы, например AES. В SQL Server 2012 (11.x) материал, зашифрованный с помощью RC4 или RC4_128, можно расшифровать на любом уровне совместимости.
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. Это поведение влияет на вычисляемые столбцы при их создании и использовании в запросах с автоматической параметризацией, а также при использовании в определениях ограничений.

Example D in the Examples section shows the difference between styles 0 and 121. Он не демонстрирует описанное выше поведение. For more information about date and time styles, see CAST and CONVERT.
Under compatibility level 110, the default style for CAST and CONVERT operations on time and datetime2 data types is always 121. Если запрос основан на прежнем поведении, следует использовать уровень совместимости ниже 110, либо явно задать в затрагиваемом запросе стиль 0.

Обновление базы данных до уровня совместимости 110 не приведет к изменению пользовательских данных, сохраненных на диске. Следует исправить эти данных соответствующим образом вручную. Например, если бы вы использовали предложение SELECT INTO для создания таблицы на основе источника, содержащего описанное выше выражение вычисляемого столбца, то сохранялись бы данные (благодаря стилю 0), а не само определение вычисляемого столбца. Потребовалось бы вручную обновлять эти данные в соответствии со стилем 121.
The + (Addition) operator can be applied to an operand of type date, time, datetime2, or datetimeoffset if the other operand has type datetime or smalldatetime. Attempting to apply the addition operator to an operand of type date, time, datetime2, or datetimeoffset and an operand of type datetime or smalldatetime will cause error 402.
Any columns in remote tables of type smalldatetime that are referenced in a partitioned view are mapped as datetime. Corresponding columns in local tables (in the same ordinal position in the select list) must be of type datetime. Any columns in remote tables of type smalldatetime that are referenced in a partitioned view are mapped as smalldatetime. Corresponding columns in local tables (in the same ordinal position in the select list) must be of type smalldatetime.

После обновления до уровня совместимости 110 произойдет сбой распределенного секционированного представления из-за несоответствия типа данных. 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 реализует следующие правила.

1) Верхний регистр H или верхний регистр W игнорируется при разделинии двух консонантов с одинаковым числом в коде SOUNDEX .

2) If the first two characters of character_expression have the same number in the SOUNDEX code, both characters are included. В противном случае, если набор последовательных согласных в коде SOUNDEX имеет тот же номер, все они исключаются, кроме первого символа.
Функция SOUNDEX реализует следующие правила.

1) Если символы H или W в верхнем разделяют две согласные буквы, которые имеют одинаковый номер в коде SOUNDEX, то согласная буква, которая находится справа, игнорируется

2) Если набор последовательных согласных в коде SOUNDEX имеет тот же номер, все они исключаются, кроме первого символа.

Дополнительные правила могут привести к тому, что значения, вычисляемые функцией, отличаются от значений, вычисляемых SOUNDEX на более ранних уровнях совместимости. После обновления до уровня совместимости 110 может потребоваться перестроить индексы, кучи или CHECK ограничения, использующие функцию SOUNDEX . For more information, see SOUNDEX.
STRING_AGG доступен без <order_clause>. STRING_AGG доступен с необязательным <order_clause>. For more information, see STRING_AGG

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

В этом разделе описываются новые особенности поведения, обусловленные появлением уровня совместимости 100.

Уровень совместимости 90 Уровень совместимости 100 Вероятность влияния
Параметр QUOTED_IDENTIFIER всегда устанавливается ON для функций с табличным значением для нескольких статистик, когда они создаются независимо от параметра уровня сеанса. Значение параметра сеанса QUOTED IDENTIFIER учитывается при создании возвращающих табличное значение функций, состоящих из нескольких инструкций. Medium
When you create or alter a partition function, datetime and smalldatetime literals in the function are evaluated assuming US_English as the language setting. The current language setting is used to evaluate datetime and smalldatetime literals in the partition function. Medium
Предложение FOR BROWSE допускается (и не учитывается) в инструкциях INSERT и SELECT INTO. Предложение FOR BROWSE не допускается в инструкциях INSERT и SELECT INTO. Medium
Полнотекстовые предикаты допускаются в предложении OUTPUT. Полнотекстовые предикаты не допускаются в предложении OUTPUT. Low
CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST и DROP FULLTEXT STOPLIST не поддерживаются. Системный список стоп-слов автоматически связывается с новыми полнотекстовыми индексами. CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST и DROP FULLTEXT STOPLIST поддерживаются. Low
MERGE не рассматривается как зарезервированное ключевое слово. MERGE — это полностью зарезервированное ключевое слово. Инструкция MERGE поддерживается на обоих уровнях совместимости, 100 и 90. Low
<dml_table_source> Использование аргумента инструкции INSERT вызывает синтаксическую ошибку. Вы можете записать результаты предложения в вложенныхINSERT, DELETEUPDATEили MERGE инструкциях, а также вставить эти результаты OUTPUT в целевую таблицу или представление. Это делается с помощью <dml_table_source> аргумента инструкции INSERT . Low
Если не указано предложение NOINDEX, инструкции DBCC CHECKDB и DBCC CHECKTABLE выполняют проверку физической и логической согласованности для одной таблицы или индексированного представления, а также для всех некластеризованных индексов и XML-индексов. Пространственные индексы не поддерживаются. Если не указано предложение NOINDEX, инструкции DBCC CHECKDB и DBCC CHECKTABLE выполняют проверку физической и логической согласованности для одной таблицы и всех ее некластеризованных индексов. Однако в XML-индексах, пространственных индексах и индексированных представлениях по умолчанию выполняются только проверки физической согласованности.

Если указан параметр WITH EXTENDED_LOGICAL_CHECKS, выполняются проверки логической согласованности в индексированных представлениях, XML-индексах и пространственных индексах (при их наличии). По умолчанию проверки физической согласованности выполняются раньше, чем проверки логической согласованности. Если также указан параметр NOINDEX, выполняются только проверки логической согласованности.
Low
OUTPUT Если предложение используется с оператором языка обработки данных (DML) и во время выполнения возникает ошибка во время выполнения инструкции, вся транзакция завершается и откатывается. Если предложение OUTPUT используется в инструкции DML и при выполнении инструкции возникает ошибка во время выполнения, дальнейшее поведение системы зависит от параметра SET XACT_ABORT. Если SET XACT_ABORT это OFFтак, ошибка прерывания инструкции, созданной инструкцией DML с помощью OUTPUT предложения, завершит инструкцию, но выполнение пакета продолжается, и транзакция не откатится. Если SET XACT_ABORT это ONтак, все ошибки во время выполнения, созданные инструкцией DML с помощью OUTPUT предложения, завершают пакет, и транзакция откатится. Low
CUBE и ROLLUP не применяются как зарезервированные ключевые слова. CUBE и ROLLUP являются зарезервированными ключевыми словами в предложении GROUP BY . Low
Строгая проверка применяется к элементам типа XML anyType . Lax validation is applied to elements of the anyType type. Дополнительные сведения см. в разделе "Подстановочные знаки" и "Проверка содержимого". Low
The special attributes xsi:nil and xsi:type can't be queried or modified by data manipulation language statements.

This means that /e/@xsi:nil fails while /e/@* ignores the xsi:nil and xsi:type attributes. However, /e returns the xsi:nil and xsi:type attributes for consistency with SELECT xmlCol, even if xsi:nil = "false".
The special attributes xsi:nil and xsi:type are stored as regular attributes and can be queried and modified.

For example, executing the query SELECT x.query('a/b/@*') returns all attributes including xsi:nil and xsi:type. Чтобы исключить эти типы в запросе, замените @*@*[namespace-uri(.) != " URI ", а не (local-name(.) = "type"local-name(.) ="nil".
Low
A user-defined function that converts an XML constant string value to a SQL Server datetime type is marked as deterministic. A user-defined function that converts an XML constant string value to a SQL Server datetime type is marked as non-deterministic. Low
Объединение XML и типы списков поддерживаются не полностью. Объединение и типы списков поддерживаются полностью, включая следующие функциональные возможности.

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

Объединение объединений

Список атомарных типов

Список объединений
Low
Параметры SET , необходимые для метода xQuery, не проверяются, если метод содержится в представлении или встроенной табличном значении функции. Параметры SET , необходимые для метода xQuery, проверяются при наличии метода в представлении или встроенной табличной функции. Ошибка возникает, если SET параметры метода заданы неправильно. Low
Значения XML-атрибута, которые содержат символы конца строки (символы возврата каретки и перевода строки), не нормализованы согласно стандарту XML. Таким образом, возвращаются оба символа вместо одного символа перевода строки. Значения XML-атрибута, которые содержат символы конца строки (символы возврата каретки и перевода строки), нормализованы согласно стандарту XML. То есть все разрывы строк во внешних сущностях синтаксического анализа (включая сущность документа) нормализуются при входных данных путем преобразования двухзначной последовательности #xD #xA и любых #xD, за которыми не следует #xA на один символ #xA.

Приложения, использующие атрибуты для транспорта строковых значений, содержащих символы конца строки, не получат эти символы обратно по мере отправки. Чтобы предотвратить выполнение этого процесса нормализации, используйте числовые сущности-символы XML для кодирования всех символов конца строки.
Low
Свойства столбца ROWGUIDCOL и IDENTITY могут быть неправильно именованы как ограничения. Например, инструкция CREATE TABLE T (C1 int CONSTRAINT MyConstraint IDENTITY) выполняется, но имя ограничения не сохраняется и не доступно для пользователя. Свойства столбца ROWGUIDCOL и IDENTITY не могут быть именованы как ограничения. Возвращается ошибка 156. Low
Обновление столбцов с использованием двухстороннего присваивания, такого как UPDATE T1 SET @v = column_name = <expression>, может привести к получению непредвиденных результатов, поскольку активное значение переменной может использоваться в других предложениях, таких как WHERE и ON, во время выполнения инструкции вместо начального значения в инструкции. Это может стать причиной того, что значения предикатов будут изменяться непредсказуемым образом при переходе от строки к строке.

Такое поведение применимо, только если уровень совместимости равен 90.
Обновление столбцов с использованием двухстороннего присваивания приводит к получению ожидаемых результатов, поскольку во время выполнения инструкции происходит доступ только к начальному значению столбца в инструкции. Low
Назначение переменных допускается в инструкции, содержащей оператор верхнего уровня UNION , но возвращает непредвиденные результаты. Learn more in example E. Назначение переменной не допускается в инструкции, содержащей оператор верхнего уровня UNION . Возвращается ошибка 10734. Find a suggested rewrite in example E. Low
В функции ODBC {fn CONVERT()} используется применяемый в языке по умолчанию формат даты. Для некоторых языков форматом по умолчанию является ГДМ, что может привести к ошибкам преобразования, если функция CONVERT() применяется в сочетании с другими функциями, такими как {fn CURDATE()}, которые предполагают использование даты в формате ГМД. Функция ODBC использует стиль 121 (независимый от языка формат YMD) при преобразовании в типы данных ODBC{fn CONVERT()}, , SQL_DATE, SQL_TIMESQLDATE и SQL_TYPE_TIMESTAMPSQL_TYPE_TIME.SQL_TIMESTAMP Low
Встроенные функции Datetime, например DATEPART не требуют, чтобы строковые входные значения были допустимыми литералами datetime. Например, SELECT DATEPART (year, '2007/05-30') компилируется успешно. Для таких встроенных средств работы со значениями даты и времени, как DATEPART, необходимо, чтобы входные строковые значения были допустимыми литералами даты и времени. Возвращается ошибка 241 при использовании недопустимого литерала даты и времени. Low
Trailing spaces specified in the first input parameter to the REPLACE function are trimmed when the parameter is of type char. Например, в инструкции SELECT '<' + REPLACE(CONVERT(char(6), 'ABC '), ' ', 'L') + '>'значение 'ABC ' неправильно вычисляется как 'ABC'. Конечные пробелы всегда сохраняются. Для приложений, использующих предыдущее поведение функции, используйте RTRIM функцию при указании первого входного параметра для функции. Например, следующий синтаксис воспроизводит поведение SQL Server 2005: SELECT '<' + REPLACE(RTRIM(CONVERT(char(6), 'ABC ')), ' ', 'L') + '>' Low

Reserved keywords

Параметр совместимости также определяет ключевые слова, зарезервированные ядро СУБД. В следующей таблице показаны зарезервированные ключевые слова, представленные каждым из уровней совместимости.

Уровень совместимости Reserved keywords
130 Подлежит уточнению.
120 None.
110 WITHIN GROUP, , TRY_CONVERTSEMANTICKEYPHRASETABLE, SEMANTICSIMILARITYDETAILSTABLESEMANTICSIMILARITYTABLE
100 CUBE, , MERGEROLLUP
90 EXTERNAL, , PIVOTUNPIVOT, REVERTTABLESAMPLE

На данном уровне совместимости зарезервированные ключевые слова включают в себя все ключевые слова, представленные на этом уровне или ниже. Таким образом, например, для приложений на уровне 110, все ключевые слова, перечисленные в предыдущей таблице, являются зарезервированными. На более низких уровнях совместимости ключевые слова уровня 100 остаются допустимыми именами объектов, но функции языка уровня 110, соответствующие этим ключевым словам, недоступны.

Будучи однажды представленным, ключевое слово остается зарезервированным. Например, зарезервированное ключевое слово PIVOT, которое было введено на уровне совместимости 90, является также зарезервированным на уровнях 100, 110 и 120.

Если приложение использует идентификатор, зарезервированный в качестве ключевого слова на его уровне совместимости, работа приложения приведет к ошибке. 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 на базу данных.

Examples

A. Изменение уровня совместимости

The following example changes the compatibility level of the AdventureWorks2022sample database database to 150, the default for SQL Server 2019 (15.x).

ALTER DATABASE AdventureWorks2022
    SET COMPATIBILITY_LEVEL = 150;
GO

В следующем примере возвращается уровень совместимости текущей базы данных.

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

B. Не учитывайте инструкция SET LANGUAGE, за исключением выполнения при уровне совместимости 120 или выше

Следующий запрос не учитывает инструкцию SET LANGUAGE, за исключением выполнения на уровне совместимости 120 или выше.

SET DATEFORMAT dmy;

DECLARE @t2 AS DATE = '12/5/2011';

SET LANGUAGE dutch;

SELECT CONVERT (VARCHAR (11), @t2, 106);
GO

Результаты, если уровень совместимости менее 120: 12 May 2011

Результаты, если уровень совместимости равен 120 или выше: 12 mei 2011

C. При уровне совместимости 110 или ниже рекурсивные ссылки в правой части предложения EXCEPT создают бесконечный цикл.

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

D. Разница между стилями 0 и 121.

When the compatibility level is lower than 110, 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.

When the compatibility level is 110 or higher, the default style for CAST and CONVERT operations on time and datetime2 data types is always 121. Дополнительные сведения см. в разделе Различия между более низкими уровнями совместимости и уровнями 100 и 110.

Дополнительные сведения о стилях даты и времени см. в описании CAST и CONVERT.

DROP TABLE IF EXISTS t1;
GO

CREATE TABLE t1
(
    c1 TIME (7),
    c2 DATETIME2
);
GO

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

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;
GO

Возвращаются следующие результаты:

TimeStyle0 TimeStyle121 Datetime2Style0 Datetime2Style121
3:15PM 15:15:35.8100000 7 июня 2011 г. 15:15 2011-06-07 15:15:35.8130000

E. Присваивание переменной — оператор UNION верхнего уровня.

В параметре уровня совместимости базы данных 90 назначение переменной допускается в инструкции, содержащей оператор верхнего уровня UNION , но возвращает непредвиденные результаты. Например, в следующих инструкциях локальной переменной @v присваивается значение столбца BusinessEntityID из объединения двух таблиц. По определению, когда SELECT оператор возвращает несколько значений, переменная назначается последним возвращаемым значением. В этом случае переменная правильно назначается последнее значение, однако возвращается результирующий набор инструкции SELECT UNION .

ALTER DATABASE AdventureWorks2022
    SET COMPATIBILITY_LEVEL = 110;
GO

USE AdventureWorks2022;
GO

DECLARE @v AS INT;

SELECT @v = BusinessEntityID
FROM HumanResources.Employee
UNION ALL
SELECT @v = BusinessEntityID
FROM HumanResources.EmployeeAddress;

SELECT @v;

В параметре уровня совместимости базы данных 100 и выше назначение переменных не допускается в инструкции, содержащей оператор верхнего уровня UNION . Возвращается ошибка 10734.

Чтобы устранить эту ошибку, перепишите запрос, как показано в следующем примере.

DECLARE @v AS INT;

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

SELECT @v;