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

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Определяет поведение обработки запросов и Transact-SQL для обеспечения совместимости с указанной версией ядра SQL. См. дополнительные сведения о других параметрах ALTER DATABASE.

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

Синтаксис

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

Аргументы

database_name

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

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

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

Продукт Версия ядра СУБД Назначение уровня совместимости по умолчанию Поддерживаемые значения уровня совместимости
База данных SQL Azure 16 160 160, 150, 140, 130, 120, 110, 100
Управляемый экземпляр SQL Azure 16 150 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

Внимание

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

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

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

Замечания

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

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

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

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

Примечание.

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

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

Чтобы просмотреть текущий уровень совместимости базы данных, запросите столбец compatibility_level представления каталога sys.databases.

База данных распространителя, созданная в более ранней версии SQL Server и обновлена до SQL Server 2016 (13.x) RTM или пакета обновления 1, имеет уровень совместимости 90, который не поддерживается для других баз данных. Это не влияет на функциональные возможности репликации. Обновление до более поздних пакетов обновления и версий SQL Server приведет к увеличению уровня совместимости базы данных распространителя, чтобы она соответствовала master базе данных.

Если в целом для базы данных требуется уровень совместимости 120 или выше, но используете модель оценки кратности SQL Server 2012 (11.x), соответствующую уровню совместимости базы данных 110, см. ALTER DATABASE SCOPED CONFIGURATION и в частности, ключевое слово LEGACY_CARDINALITY_ESTIMATION = ON.

Примечания для SQL Azure

Уровень совместимости по умолчанию — SQL Server 2022 (160) для вновь созданных баз данных в База данных SQL Azure.

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

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

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

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

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

Чтобы определить текущий уровень совместимости, выполните запрос compatibility_level к столбцу sys.database.

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) без изменений приложения (за исключением подключения к базе данных). Дополнительные сведения см. в статье Сертификация на совместимость.

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

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

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

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

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

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

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

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

  • Прекращенная функциональность, представленная в данной версии SQL Server, не защищена уровнем совместимости. Это относится к функциям, которые были удалены из ядро СУБД SQL Server. Например, FASTFIRSTROW указание было прекращено в SQL Server 2012 (11.x) и заменено указанием OPTION (FAST n ) . Установка уровня совместимости базы данных на 110 не приведет к восстановлению прекращенного указания. Дополнительные сведения о прекращенных функциях см. в статье Нерекомендуемые функции ядра СУБД в SQL Server.

  • Критические изменения , внесенные в определенную версию SQL Server, могут не быть защищены уровнем совместимости. Это относится к изменениям поведения между версиями SQL Server ядро СУБД. Поведение Transact-SQL обычно зависит от уровня совместимости. Однако измененные или удаленные системные объекты не защищены уровнем совместимости.

    Пример критического изменения, защищенного уровнем совместимости, — неявное преобразование с типов данных datetime до datetime2. При уровне совместимости базы данных 130 эти преобразования демонстрируют повышенную точность благодаря учету долей миллисекунд. В результате преобразования дают иные значения. Чтобы восстановить прежнее поведение преобразования, задайте уровень совместимости базы данных 120 или ниже.

    Примеры критических изменений, не защищенных уровнем совместимости.

    • Изменение имен столбцов в системных объектах. В SQL Server 2012 (11.x) столбец single_pages_kb sys.dm_os_sys_info был переименован pages_kbв . Независимо от уровня совместимости запрос SELECT single_pages_kb FROM sys.dm_os_sys_info вызывает ошибку 207 (Недопустимое имя столбца).
    • Удаление системных объектов. В SQL Server 2012 (11.x) sp_dboption удалено. Независимо от уровня совместимости инструкция EXEC sp_dboption 'AdventureWorks2022', 'autoshrink', 'FALSE'; создаст ошибку 2812 (Couldn't find stored procedure 'sp_dboption').

    Подробные сведения о критических изменениях см. в статьях Критические изменения в ядре СУБД в SQL Server 2019 (15.x), Критические изменения в функциях ядра СУБД в SQL Server 2017 (14.x), Критические изменения в функциях ядра СУБД в SQL Server 2016 и Критические изменения в функциях ядра СУБД в SQL Server 2014.

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

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

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

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

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

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

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

    Область применения: SQL Server (начиная с версии SQL Server 2016 (13.x)), База данных SQL Azure.

    Например, при выпуске 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
    13 (SQL Server 2016 (13.x)) 100–120


    130
    Выключено
    С
    Выкл.
    Включено
    Отключен
    Включен
    Включено
    Активировано
    Выключено
    Активировано
    Выключено
    Включен
    14 (SQL Server 2017 (14.x)) 100–120


    130
    140
    Выключено
    С
    Выкл.
    С
    Выкл.
    Включено
    Отключен
    Включен
    Включено
    Включен
    Включено
    Активировано
    Выключено
    Активировано
    Выключено
    Активировано
    Выключено
    Включен
    15 (SQL Server 2019 (15.x)) и 12 (База данных SQL Azure) 100–120


    130–140
    150
    Выключено
    С
    Выкл.
    С
    Выкл.
    Включено
    Отключен
    Включен
    Включено
    Включен
    Включено
    Активировано
    Выключено
    Активировано
    Выключено
    Активировано
    Выключено
    Включен
    16 (SQL Server 2022 (16.x)) и 12 (База данных SQL Azure) 100–120


    От 130 до 150
    160
    Выключено
    С
    Выкл.
    С
    Выкл.
    Включено
    Отключен
    Включен
    Включено
    Включен
    Включено
    Активировано
    Выключено
    Активировано
    Выключено
    Активировано
    Выключено
    Включен

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

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

    Например, при выпуске 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
    Выключено
    Включен
    14 (SQL Server 2017 (14.x))1 < 140
    140
    Выключено
    Включен
    15 (SQL Server 2019 (15.x))1 < 150
    150
    Выключено
    Включен
    16 (SQL Server 2022 (16.x))1 < 160
    160
    Выключено
    Включен

    1 Также применимо к База данных SQL Azure.

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

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

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

Уровень совместимости 150 и ниже Уровень совместимости 160
У параметризованных запросов есть один план запроса на основе параметров, используемых для первого выполнения. Только один план запроса кэшируется и используется для всех значений параметров. Это может привести к тому, что план запроса будет неэффективным для некоторых значений параметра (план с учетом параметров). У параметризованных запросов может быть несколько кэшированных планов запросов для разных категорий селективности параметра. Оптимизация плана с учетом параметров включена по умолчанию на уровне совместимости 160. Дополнительные сведения см. в разделе Оптимизация PSP.
Оценка кратности использует только один набор предположений модели по умолчанию о базовом распределении данных и шаблонах использования для всех баз данных и запросов. Единственным способом изменения или корректировки любого из этих предположений является то, когда пользователь выполняет ручной процесс, чтобы явно указать, какие предположения модели следует использовать с помощью подсказок запроса. В эту модель по умолчанию нельзя внести внутреннюю корректировку после создания плана запроса. Оценка кратности начинается с набора предположений модели по умолчанию о базовых шаблонах распределения данных и использования, но после некоторых выполнений для данного запроса ядро СУБД узнает, какие различные наборы предположений модели могут дать более точные оценки, и поэтому корректирует предположения, используемые для лучшего соответствия запрашиваемому набору данных. Обратная связь по 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
При оценке кратности для инструкций, ссылающихся на функции с табличным значением с несколькими инструкциями, используется предположение фиксированной строки. При оценке кратности для соответствующих инструкций, ссылающихся на функции с табличным значением с несколькими инструкциями, будет использоваться фактическая кратность из выходных данных функции. Это возможно благодаря выполнению с чередованием для функций с табличным значением с несколькими инструкциями.
Запросы в пакетном режиме, запрашивающие недостаточно размеров предоставления памяти, которые приводят к утечке на диск, могут продолжать возникать проблемы с последовательными выполнением. Запросы в пакетном режиме, запрашивающие недостаточно размеров предоставления памяти, которые приводят к переливу на диск, могут повысить производительность при последовательных выполнении. Этот возможно благодаря обратной связи по временно предоставляемому буферу памяти в пакетном режиме, которая обновляет размер временно предоставляемого буфера кэшированного плана, если для операторов пакетного режима произошел перенос.
Запросы в пакетном режиме, запрашивающие чрезмерный размер предоставления памяти, что приводит к проблемам с параллелизмом, может по-прежнему иметь проблемы с последовательными выполнением. Запросы в пакетном режиме, запрашивающие чрезмерный размер предоставления памяти, которые приводят к проблемам параллелизма, могут повысить параллелизм при последовательных выполнении. Этот возможно благодаря обратной связи по временно предоставляемому буферу памяти в пакетном режиме, которая обновляет размер временно предоставляемого буфера кэшированного плана, если был запрошен слишком большой объем.
Запросы в пакетном режиме, содержащие операторы соединения, подходят для трех алгоритмов физического соединения, включая вложенный цикл, хэш-соединение и соединение слиянием. Если оценки кратности неверны для входных данных соединения, может быть выбран недопустимый алгоритм соединения. Если это произойдет, производительность будет страдать, и алгоритм несоответствуемого соединения будет использоваться до тех пор, пока кэшированный план не будет перекомпилирован. Существует дополнительный оператор соединения — адаптивное соединение. Если для входных данных внешнего соединения сборки неверны оценки кратности, может быть выбран недопустимый алгоритм соединения. Если это происходит, и инструкция имеет право на адаптивное соединение, вложенный цикл будет использоваться для небольших входных данных соединения, а хэш-соединение будет использоваться для больших входных данных соединения динамически без необходимости повторной компиляции.
Простейшие планы, ссылающиеся на индексы 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 в инструкции INSERT-SELECT является однопоточной. Операция 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 по умолчанию отключена в SQL Server 2014 (12.x). Трассировка 2371 по умолчанию включена в SQL Server 2016 (13.x). Флаг трассировки 2371 дает средству автоматического обновления статистики инструкции делать выборку подмножества строк меньшего размера, но более эффективным образом, если в таблице очень много строк.

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

Еще одно улучшение — выполнение запросов во время обновления статистики, без блокировки запроса.
На уровне 120 выборка статистики осуществляется одним потоком. На уровне 130 выборка статистики осуществляется несколькими потоками (параллельный процесс).
Максимальное значение — 253 входящих внешних ключа. На одну таблицу может ссылаться до 10 000 входящих внешних ключей или аналогичных элементов. Ограничения см. в разделе Create Foreign Key Relationships.
Нерекомендуемые хэш-алгоритмы MD2, MD4, MD5, SHA и SHA1 разрешены. Допускаются только хэш-алгоритмы SHA2_256 и SHA2_512.
SQL Server 2016 (13.x) включает улучшения в некоторых преобразованиях типов данных и некоторых (в основном редких) операциях. Дополнительные сведения см. в статье Улучшения SQL Server 2016 для обработки некоторых типов данных и нестандартных операций.
Функция 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. Перед настройкой уровня совместимости базы данных 110 из-за проблем с производительностью, ознакомьтесь с рекомендациями в разделе Планы запросов SQL Server 2014 (12.x) в статье Новые возможности ядра СУБД.
Если уровень совместимости ниже 120, при преобразовании значения date в строковое параметр языка не учитывается. Это поведение зависит только от типа даты . См. пример B в разделе "Примеры ". Параметр языка учитывается при преобразовании значения date в строковое значение.
Рекурсивные ссылки в правой части предложения EXCEPT создают бесконечный цикл. Пример C в разделе "Примеры" демонстрирует это поведение. Рекурсивные ссылки в 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.
Функции XQuery string-length и substring считают каждый суррогатный символ за два символа. Функции XQuery string-length и substring считают каждый суррогатный символ за один символ.
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, можно расшифровать на любом уровне совместимости.
Используемый по умолчанию стиль для операций CAST и CONVERT над типами данных time и datetime2 — 121, кроме случая, когда любой из этих типов используется в выражении вычисляемого столбца. Для вычисляемых столбцов используемый по умолчанию стиль — 0. Это поведение влияет на вычисляемые столбцы при их создании и использовании в запросах с автоматической параметризацией, а также при использовании в определениях ограничений.

Пример D в разделе "Примеры" показывает разницу между стилями 0 и 121. Он не демонстрирует описанное выше поведение. Дополнительные сведения о стилях даты и времени см. в разделе CAST и CONVERT.
При уровне совместимости 110 стиль по умолчанию для операций CAST и CONVERT над типами данных time и datetime2 всегда имеет значение 121. Если запрос основан на прежнем поведении, следует использовать уровень совместимости ниже 110, либо явно задать в затрагиваемом запросе стиль 0.

Обновление базы данных до уровня совместимости 110 не приведет к изменению пользовательских данных, сохраненных на диске. Следует исправить эти данных соответствующим образом вручную. Например, если бы вы использовали предложение SELECT INTO для создания таблицы на основе источника, содержащего описанное выше выражение вычисляемого столбца, то сохранялись бы данные (благодаря стилю 0), а не само определение вычисляемого столбца. Потребовалось бы вручную обновлять эти данные в соответствии со стилем 121.
Оператор +(добавление) можно применить к операнду типа date, time, datetime2 или datetimeoffset, если другой операнда имеет тип datetime или smalldatetime. Попытка применить оператор сложения к операнду типа date, time, datetime2 или datetimeoffset и операнду типа datetime или smalldatetime приведет к появлению ошибки 402.
Любые столбцы удаленных таблиц типа smalldatetime, фигурирующие в секционированном представлении, сопоставляются как тип datetime. Соответствующие им столбцы локальных таблиц (столбцы, занимающие те же порядковые позиции в списке выбора) должны иметь тип datetime. Любые столбцы удаленных таблиц типа smalldatetime, фигурирующие в секционированном представлении, сопоставляются как тип smalldatetime. Соответствующие им столбцы локальных таблиц (столбцы, занимающие те же порядковые позиции в списке выбора) должны иметь тип smalldatetime.

После обновления до уровня совместимости 110 произойдет сбой распределенного секционированного представления из-за несоответствия типа данных. Данную проблему вы можете решить, изменив тип данных в удаленной таблице на datetime или задав уровень совместимости локальной базы данных 100 или ниже.
Функция SOUNDEX реализует следующие правила.

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

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

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

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

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

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

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

Уровень совместимости 90 Уровень совместимости 100 Вероятность влияния
Параметр QUOTED_IDENTIFIER всегда имеет значение ON для функций с табличным значением, если они создаются независимо от параметра уровня сеанса. Значение параметра сеанса QUOTED IDENTIFIER учитывается при создании возвращающих табличное значение функций, состоящих из нескольких инструкций. Средняя
При создании или изменении функции секционирования литералы datetime и smalldatetime в функции вычисляются на основе предположения, что параметры языка имеют значение US_English. Текущие параметры языка используются для вычисления литералов datetime и smalldatetime в функции секционирования. Средняя
Предложение FOR BROWSE допускается (и не учитывается) в инструкциях INSERT и SELECT INTO. Предложение FOR BROWSE не допускается в инструкциях INSERT и SELECT INTO. Средняя
Полнотекстовые предикаты допускаются в предложении OUTPUT. Полнотекстовые предикаты не допускаются в предложении OUTPUT. Низкая
CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST и DROP FULLTEXT STOPLIST не поддерживаются. Системный список стоп-слов автоматически связывается с новыми полнотекстовыми индексами. CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST и DROP FULLTEXT STOPLIST поддерживаются. Низкая
MERGE не рассматривается как зарезервированное ключевое слово. MERGE является полностью зарезервированным ключевым словом. Инструкция MERGE поддерживается на обоих уровнях совместимости, 100 и 90. Низкая
При использовании аргумента <dml_table_source> в инструкции INSERT возникает синтаксическая ошибка. Можно собрать результаты предложения OUTPUT во вложенных инструкциях INSERT, UPDATE, DELETE или MERGE и вставить эти результаты в целевую таблицу или представление. Это выполняется с помощью аргумента <dml_table_source> инструкции INSERT. Низкая
Если не указано предложение NOINDEX, инструкции DBCC CHECKDB и DBCC CHECKTABLE выполняют проверку физической и логической согласованности для одной таблицы или индексированного представления, а также для всех некластеризованных индексов и XML-индексов. Пространственные индексы не поддерживаются. Если не указано предложение NOINDEX, инструкции DBCC CHECKDB и DBCC CHECKTABLE выполняют проверку физической и логической согласованности для одной таблицы и всех ее некластеризованных индексов. Однако в XML-индексах, пространственных индексах и индексированных представлениях по умолчанию выполняются только проверки физической согласованности.

Если указан параметр WITH EXTENDED_LOGICAL_CHECKS, выполняются проверки логической согласованности в индексированных представлениях, XML-индексах и пространственных индексах (при их наличии). По умолчанию проверки физической согласованности выполняются раньше, чем проверки логической согласованности. Если также указан параметр NOINDEX, выполняются только проверки логической согласованности.
Низкая
Если предложение OUTPUT используется в инструкции DML и при выполнении инструкции возникает ошибка времени выполнения, то завершается вся транзакция и происходит откат. Если предложение OUTPUT используется в инструкции DML и при выполнении инструкции возникает ошибка во время выполнения, дальнейшее поведение системы зависит от параметра SET XACT_ABORT. Если SET XACT_ABORT значение OFF, ошибка прерывания инструкции, созданной инструкцией DML с помощью OUTPUT предложения, завершит инструкцию, но выполнение пакета продолжается, и транзакция не откатится. Если параметр SET XACT_ABORT имеет значение ON, то при возникновении любых ошибок во время выполнения, вызванных инструкцией DML, в которой используется предложение OUTPUT, происходит завершение пакета и откат транзакции. Низкая
Cube и ROLLUP не применяются в качестве зарезервированных ключевых слов. CUBE и ROLLUP являются зарезервированными ключевыми словами в предложении GROUP BY. Низкая
К элементам типа XML anyType применяется строгая проверка. К элементам типа anyType применяется нестрогая проверка. Дополнительные сведения см. в статье Компоненты-шаблоны и проверка содержимого. Низкая
Специальные атрибуты xsi:nil и xsi:type нельзя запрашивать или изменять с помощью инструкций языка обработки данных.

Это означает, что выражение /e/@xsi:nil оканчивается неудачей, несмотря на то, что в предложении /e/@* атрибуты xsi:nil и xsi:type пропускаются. Однако предложение /e возвращает атрибуты xsi:nil и xsi:type для согласованности с инструкцией SELECT xmlCol, даже если xsi:nil = "false".
Специальные атрибуты xsi:nil и xsi:type хранятся как обычные атрибуты, и к ним можно выполнять запросы и вносить в них изменения.

Например, выполнение запроса SELECT x.query('a/b/@*') возвращает все атрибуты, включая xsi:nil и xsi:type. Чтобы исключить эти типы из запроса, замените @* на @*[namespace-uri(.) != "insert xsi namespace uri", а не (local-name(.) = "type" или local-name(.) ="nil".
Низкая
Определяемая пользователем функция, которая преобразует строковое значение XML-константы в тип даты и времени SQL Server, помечается как детерминированный. Определяемая пользователем функция, преобразующая строковое значение XML-константы в тип даты и времени SQL Server, помечена как недетерминированная. Низкая
Объединение XML и типы списков поддерживаются не полностью. Объединение и типы списков поддерживаются полностью, включая следующие функциональные возможности.

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

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

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

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

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

Такое поведение применимо, только если уровень совместимости равен 90.
Обновление столбцов с использованием двухстороннего присваивания приводит к получению ожидаемых результатов, поскольку во время выполнения инструкции происходит доступ только к начальному значению столбца в инструкции. Низкая
Назначение переменных допускается в инструкции, содержащей оператор верхнего уровня UNION , но возвращает непредвиденные результаты. Дополнительные сведения см. в примере E. Назначение переменной не допускается в инструкции, содержащей оператор UNION верхнего уровня. Возвращается ошибка 10734. Найдите предложенное исправление в примере E. Низкая
В функции ODBC {fn CONVERT()} используется применяемый в языке по умолчанию формат даты. Для некоторых языков форматом по умолчанию является ГДМ, что может привести к ошибкам преобразования, если функция CONVERT() применяется в сочетании с другими функциями, такими как {fn CURDATE()}, которые предполагают использование даты в формате ГМД. В функции ODBC {fn CONVERT()} используется стиль 121 (независимый от языка формат ГМД) при преобразовании в такие типы данных ODBC, как SQL_TIMESTAMP, SQL_DATE, SQL_TIME, SQLDATE, SQL_TYPE_TIME и SQL_TYPE_TIMESTAMP. Низкая
Встроенные функции Datetime, например DATEPART не требуют, чтобы строковые входные значения были допустимыми литералами datetime. Например, SELECT DATEPART (year, '2007/05-30') компилируется успешно. Для таких встроенных средств работы со значениями даты и времени, как DATEPART, необходимо, чтобы входные строковые значения были допустимыми литералами даты и времени. Возвращается ошибка 241 при использовании недопустимого литерала даты и времени. Низкая
Конечные пробелы, указанные в первом входном параметре функции REPLACE, обрезаются, когда параметр имеет тип char. Например, в инструкции SELECT '<' + REPLACE(CONVERT(char(6), 'ABC '), ' ', 'L') + '>'значение 'ABC ' неправильно вычисляется как 'ABC'. Конечные пробелы всегда сохраняются. Для приложений, использующих предыдущее поведение функции, используйте RTRIM функцию при указании первого входного параметра для функции. Например, следующий синтаксис воспроизводит поведение SQL Server 2005: SELECT '<' + REPLACE(RTRIM(CONVERT(char(6), 'ABC ')), ' ', 'L') + '>' Низкая

Зарезервированные ключевые слова

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

Уровень совместимости Зарезервированные ключевые слова
130 Подлежит уточнению.
120 Нет.
110 WITHIN GROUP, , TRY_CONVERTSEMANTICKEYPHRASETABLE, SEMANTICSIMILARITYDETAILSTABLESEMANTICSIMILARITYTABLE
100 CUBE, , MERGEROLLUP
90 EXTERNAL, , PIVOTUNPIVOT, REVERTTABLESAMPLE

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

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

Если приложение использует идентификатор, зарезервированный в качестве ключевого слова на его уровне совместимости, работа приложения приведет к ошибке. Чтобы обойти эту проблему, заключите идентификатор в квадратные скобки ([]) или кавычки (""). Например, чтобы обновить приложение, использующее идентификатор EXTERNAL, до уровня совместимости 90, можно изменить идентификатор на [EXTERNAL] или "EXTERNAL".

См. дополнительные сведения о зарезервированных ключевых словах.

Разрешения

Необходимо разрешение ALTER на базу данных.

Примеры

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

В следующем примере уровень AdventureWorks2022 совместимости образца базы данных базы данных изменяется на 150, значение по умолчанию для 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 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)) 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.

Если уровень совместимости ниже 110, по умолчанию используется стиль для операций CAST и CONVERT над типами данных time и datetime2 — 121, кроме случая, когда любой из этих типов используется в выражении вычисляемого столбца. Для вычисляемых столбцов используемый по умолчанию стиль — 0.

При уровне совместимости 110 и выше стиль по умолчанию для операций CAST и CONVERT над типами данных time и datetime2 всегда имеет значение 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

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

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

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

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

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

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