Уровень совместимости инструкции 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 }

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

database_name

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

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

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

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

Remarks

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

При подключении или восстановлении базы данных, а также после обновления на месте в SQL Server 2017 (14.x); ожидается описанное ниже поведение.

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

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

Примечание

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

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

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

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

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

SELECT name, compatibility_level FROM sys.databases;

Заметки для Базы данных SQL Azure

По состоянию на ноябрь 2019 г. в База данных SQL Azure для создаваемых баз данных по умолчанию применяется уровень совместимости 150. Майкрософт не обновляет уровень совместимости существующих баз данных. Это осуществляют заказчики по собственному усмотрению. Майкрософт настоятельно рекомендует клиентам запланировать обновление до последнего уровня совместимости, чтобы использовать последние улучшения оптимизации запросов.

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

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

SELECT SERVERPROPERTY('ProductVersion');

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

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

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

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

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

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

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

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

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

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

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

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

  • Критические изменения, введенные в определенной версии SQL Server, могут не защищаться уровнем совместимости. Это относится к изменениям в поведении между версиями Компонент SQL Server Database Engine. Поведение 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 'AdventureWorks2016', 'autoshrink', 'FALSE'; выдает ошибку 2812 (не удалось найти хранимую процедуру "sp_dboption").

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

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

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

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

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

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

Фундаментальные изменения, влияющие на план и добавляемые только к уровню совместимости по умолчанию новой версии Компонент Database Engine:

  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); по умолчанию (130). Необходимо явно включить только исправления оптимизатора запросов после выпуска RTM.

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

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

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

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


    130
    Выкл.
    С

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

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

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


    130


    140
    Выкл.
    С

    Выкл.
    С

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

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

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

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

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


    130–140


    150
    Выкл.
    С

    Выкл.
    С

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

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

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

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

    Выключено
    Активировано
    16 (SQL Server 2022 г. (16.x)) и 12 (база данных Azure SQL) 100–120


    от 130 до 150


    160
    Выкл.
    С

    Выкл.
    С

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

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

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

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

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

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

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

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

    Позже, при выпуске SQL Server 2017 (14.x);, изменения, внесенные в процесс оценки кратности, были доступны только для баз данных, использующих уровень совместимости SQL Server 2017 (14.x); по умолчанию (140). Уровень совместимости базы данных 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.
Оценка кратности использует только один набор предположений модели по умолчанию о базовом распределении данных и шаблонах использования для всех баз данных и запросов. Единственный способ изменить или скорректировать любое из этих предположений — это сделать вручную, чтобы явно указать, какие предположения модели следует использовать с помощью указаний запроса. В эту модель по умолчанию нельзя внести внутреннюю корректировку после создания плана запроса. Оценка кратности начинается с набора предположений модели по умолчанию о базовом распределении данных и шаблонах использования, но после некоторых выполнений для заданного запроса компонент Компонент Database Engine узнает, какие различные наборы предположений модели могут дать более точные оценки, и, следовательно, корректирует используемые допущения, чтобы лучше соответствовать запрашиваемому набору данных. Обратная связь по CE включена по умолчанию на уровне совместимости 160. Дополнительные сведения см. в разделе Обратная связь по CE.
Ядро СУБД не пытается автоматически определить оптимальную степень параллелизма. Сведения об управлении максимальной степенью параллелизма (MAXDOP) на уровне экземпляра, базы данных, запроса или рабочей нагрузки вручную см. в разделе Настройка параметра конфигурации сервера максимальной степени параллелизма. Обратная связь по степени параллелизма (DOP) повышает производительность запросов, определяя неэффективность параллелизма для повторяющихся запросов на основе затраченного времени и ожиданий. Если использование параллелизма считается неэффективным, обратная связь DOP снижает DOP от настроенного ранее значения для следующего выполнения запроса и проверяет, помогло ли это. Обратная связь DOP не включена по умолчанию. Чтобы включить обратную связь по DOP, включите конфигурацию области базы данных DOP_FEEDBACK в базе данных. Дополнительные сведения см. в разделе Обратная связь по DOP.

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

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

Уровень совместимости 140 и ниже Уровень совместимости 150
Реляционные хранилища данных и аналитические рабочие нагрузки могут не использовать индексы columnstore из-за издержек OLTP, отсутствия поддержки поставщиков или других ограничений. Без индексов 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 может выполняться в пакетном режиме.
Функции с табличным значением с несколькими инструкциями (TVF) не имеют чередующегося выполнения Выполнение с чередованием для функций с табличным значением с несколькими инструкциями для повышения качества плана.

Исправления, которые включались флагом трассировки 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 имеет значение OFF по умолчанию в SQL Server 2014 (12.x). Трассировка 2371 имеет значение ON по умолчанию в 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 в строковое параметр языка не учитывается. Это поведение специфично только для типа даты . См. пример Б, приведенный ниже в разделе примеров. Параметр языка учитывается при преобразовании значения date в строковое значение.
Рекурсивные ссылки в правой части предложения EXCEPT создают бесконечный цикл. Это поведение показано в примере В в разделе примеров. Рекурсивные ссылки в предложении 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. Это поведение влияет на вычисляемые столбцы при их создании и использовании в запросах с автоматической параметризацией, а также при использовании в определениях ограничений.

Разница между стилями 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_IDENTIFER всегда имеет значение 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 datetime, отмечается как детерминированная. Определяемая пользователем функция, которая преобразует строковое значение константы XML в тип SQL Server datetime, отмечается как недетерминированная. Низкий
Объединение 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. Низкий
Встроенные функции даты и времени, такие как 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') + '>'. Низкий

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

Настройка совместимости также определяет ключевые слова, зарезервированные компонентом Компонент Database Engine. В следующей таблице показаны зарезервированные ключевые слова, представленные каждым из уровней совместимости.

Уровень совместимости Зарезервированные ключевые слова
130 Подлежит уточнению.
120 Нет.
110 WITHIN GROUP, TRY_CONVERT, SEMANTICKEYPHRASETABLE, SEMANTICSIMILARITYDETAILSTABLE, SEMANTICSIMILARITYTABLE
100 CUBE, MERGE, ROLLUP
90 EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE

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

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

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

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

Разрешения

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

Примеры

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

В следующем примере уровень совместимости примера базы данных AdventureWorks2019samplesample database равен 150, по умолчанию для SQL Server 2019 (15.x).

ALTER DATABASE AdventureWorks2019
SET COMPATIBILITY_LEVEL = 150;
GO

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

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

Б. Не учитывайте инструкция 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

В. При уровне совместимости 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

Г. Разница между стилями 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 AdventureWorks2012
SET compatibility_level = 110;
GO
USE AdventureWorks2012;
GO
DECLARE @v int;
SELECT @v = BusinessEntityID FROM HumanResources.Employee
UNION ALL
SELECT @v = BusinessEntityID FROM HumanResources.EmployeeAddress;
SELECT @v;

При значении уровня совместимости базы данных 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;

Дальнейшие действия

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