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

Определяет поведение конкретных баз данных для совместимости с указанной версией SQL Server. Полный список параметров инструкции ALTER DATABASE см. в разделе ALTER DATABASE (Transact-SQL).

Значок ссылки на раздел Синтаксические обозначения Transact-SQL

Синтаксис

ALTER DATABASE database_name 
SET COMPATIBILITY_LEVEL = { 90 | 100 | 110 }

Аргументы

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

  • COMPATIBILITY_LEVEL { 90 | 100 | 110 }
    Версия SQL Server, с которой необходимо обеспечить совместимость базы данных. Это должно быть одно из следующих значений.

    90 = SQL Server 2005

    100 = SQL Server 2008 и SQL Server 2008 R2

    110 = SQL Server 2012

Замечания

Для всех вариантов установки SQL Server 2012 уровень совместимости по умолчанию равен 110. Для баз данных, созданных в SQL Server 2012, он устанавливается в это же значение, если для базы данных model не установлен более низкий уровень совместимости. При обновлении базы данных до SQL Server 2012 с более ранней версии SQL Server база данных сохраняет свой существующий уровень совместимости, если его значение не меньше 90. Обновление базы данных с уровнем совместимости менее 90 приведет к установке уровня совместимости, равного 90. Это относится и к системным, и к пользовательским базам данных. Чтобы изменить уровень совместимости базы данных, используется инструкция ALTER DATABASE. Чтобы просмотреть текущий уровень совместимости базы данных, можно запросить столбец compatibility_level представления каталога sys.databases.

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

Уровень совместимости влияет на поведение только указанных баз данных, а не всего сервера. Уровень совместимости обеспечивает лишь частичную обратную совместимость с ранними версиями SQL Server. Используйте уровень совместимости в качестве промежуточной меры в процессе устранения проблем, возникших из-за различий в поведении между версиями, которые определяются соответствующей настройкой уровня совместимости. Если на существующие приложения SQL Server оказывают влияние различия поведения SQL Server 2012, настройте приложение для работы должным образом. Затем с помощью инструкции ALTER DATABASE измените значение уровня совместимости на 100. Новая настройка уровня совместимости вступит в силу в следующий раз, когда база данных будет сделана текущей (либо в качестве базы данных по умолчанию для имени входа, либо при указании в инструкции USE).

Рекомендации

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

  1. Перевести базу данных в однопользовательский режим работы с помощью инструкции ALTER DATABASE SET SINGLE_USER.

  2. Изменить уровень совместимости базы данных.

  3. Перевести базу данных в многопользовательский режим работы с помощью инструкции ALTER DATABASE SET MULTI_USER.

  4. Дополнительные сведения об установлении режимов работы базы данных см. в разделе ALTER DATABASE (Transact-SQL).

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

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

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

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

Установка уровня совместимости 90

Установка уровня совместимости 100

Вероятность влияния

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

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

Средняя

При создании или изменении функции секционирования литералы datetime и smalldatetime в функции вычисляются на основе предположения, что параметры языка имеют значение US_English.

Текущие параметры языка используются для вычисления литералов datetime и smalldatetime в функции секционирования.

Средняя

Предложение FOR BROWSE допускается (и не учитывается) в инструкциях INSERT и SELECT INTO.

Предложение FOR BROWSE не допускается в инструкциях SELECT INTO и INSERT.

Средняя

Полнотекстовые предикаты допускаются в предложении 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 применяется строгая проверка.

К элементам типа XML anyType применяется нестрогая проверка. Дополнительные сведения см. в разделе Компоненты-шаблоны и проверка достоверности содержимого.

Малая

К специальным атрибутам xsi:nil и xsi:type нельзя выполнять запросы или вносить в них изменения с помощью инструкций DML.

Это означает, что выражение /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 верхнего уровня, но возвращает непредвиденные результаты. Например, в следующих инструкциях локальной переменной @v присваивается значение столбца BusinessEntityID из объединения двух таблиц. Если инструкция SELECT возвращает более одного значения, переменной присваивается последнее возвращенное значение. В этом случае переменной правильно присваивается последнее значение, но происходит также возврат результирующего набора инструкции SELECT UNION.

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

Присваивание значения переменной не допускается в инструкции, содержащей оператор 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;

Малая

В функции ODBC {fn CONVERT()} используется применяемый в языке по умолчанию формат даты. Для некоторых языков форматом по умолчанию является «ГДМ», что может привести к ошибкам преобразования, если функция CONVERT() применяется в сочетании с другими функциями, такими как {fn CURDATE()}, которые предполагают использование даты в формате «ГМД».

В функции ODBC {fn CONVERT()} используется стиль 121 (независимый от языка формат «ГМД») при преобразовании в такие типы данных ODBC, как SQL_TIMESTAMP, SQL_DATE, SQL_TIME, SQLDATE, SQL_TYPE_TIME и SQL_TYPE_TIMESTAMP.

Малая

Функция ODBC {fn CURDATE()} возвращает только даты в формате «ГГГГ-ММ-ДД».

Функция ODBC {fn CURDATE()} возвращает и дату, и время, например «ГГГГ-ММ-ДД ЧЧ:ММ:СС».

Малая

Для таких встроенных средств работы со значениями даты и времени, как DATEPART, не требуется, чтобы строковые входные значения были допустимыми литералами даты и времени. Например, компиляция инструкции SELECT DATEPART (year, '2007/05-30') выполняется успешно.

Для таких встроенных средств работы со значениями даты и времени, как DATEPART, необходимо, чтобы строковые входные значения были допустимыми литералами даты и времени. Возвращается ошибка 241 при использовании недопустимого литерала даты и времени.

Low

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

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

Уровень совместимости 100 и ниже

Установка уровня совместимости 110

Объекты базы данных среды CLR выполняются в среде CLR версии 4. Однако некоторые из особенностей поведения, изменившиеся в версии 4 среды CLR, не используются. Дополнительные сведения см. в разделе новые возможности в интеграции со средой CLR.

Объекты базы данных среды CLR выполняются в среде CLR версии 4.

Функции XQuery string-length и substring считают каждый суррогатный символ за два символа.

Функции XQuery string-length и substring считают каждый суррогатный символ за один символ.

Оператор PIVOT можно использовать в запросах рекурсивного обобщенного табличного выражения (CTE). Однако при наличии нескольких строк в группировании запрос возвращает неверные результаты.

Оператор PIVOT нельзя использовать в запросах рекурсивного обобщенного табличного выражения (CTE). Возвращается ошибка.

Алгоритм RC4 поддерживается только в целях обратной совместимости. Когда база данных имеет уровень совместимости 90 или 100, новые материалы могут шифроваться только с помощью алгоритмов RC4 или RC4_128. (Не рекомендуется.) В SQL Server 2012 материалы, зашифрованные с помощью алгоритмов RC4 или RC4_128, могут быть расшифрованы на любом уровне совместимости.

Новые материалы нельзя шифровать с помощью RC4 или RC4_128. Используйте вместо этого более новые алгоритмы, например AES. В SQL Server 2012 материалы, зашифрованные с помощью алгоритмов RC4 или RC4_128, могут быть расшифрованы на любом уровне совместимости.

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

В следующем примере показано различие между стилями 0 и 121. В примере не рассматривается описанное выше поведение. Дополнительные сведения о стилях даты и времени см. в разделе Функции CAST и CONVERT (Transact-SQL).

CREATE TABLE t1 (c1 time(7), c2 datetime2); 
INSERT t1 (c1,c2) VALUES (GETDATE(), GETDATE());
SELECT CONVERT(nvarchar(16),c1,0) AS TimeStyle0
       ,CONVERT(nvarchar(16),c1,121)AS TimeStyle121
       ,CONVERT(nvarchar(32),c2,0) AS Datetime2Style0
       ,CONVERT(nvarchar(32),c2,121)AS Datetime2Style121
FROM t1;
-- Returns values such as the following.
TimeStyle0       TimeStyle121     Datetime2Style0      Datetime2Style121
---------------- ---------------- -------------------- --------------------------
3:15PM           15:15:35.8100000 Jun  7 2011  3:15PM  2011-06-07 15:15:35.8130000

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

Обновление базы данных до уровня совместимости 110 не приведет к изменению пользовательских данных, сохраненных на диске. Следует исправить эти данных соответствующим образом вручную. Например, если бы вы использовали предложение SELECT INTO для создания таблицы на основе источника, содержащего описанное выше выражение вычисляемого столбца, то сохранялись бы данные (благодаря стилю 0), а не само определение вычисляемого столбца. Потребовалось бы вручную обновлять эти данные в соответствии со стилем 121.

Любые столбцы удаленных таблиц типа smalldatetime, фигурирующих в секционированном представлении, сопоставляются с типом datetime. Соответствующие им столбцы локальных таблиц (столбцы, занимающие те же порядковые позиции в списке выбора) должны иметь тип datetime.

Любые столбцы удаленных таблиц типа smalldatetime, фигурирующих в секционированном представлении, сопоставляются с типом smalldatetime. Соответствующие им столбцы локальных таблиц (столбцы, занимающие те же порядковые позиции в списке выбора) должны иметь тип smalldatetime.

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

Функция SOUNDEX реализует следующие правила.

  1. Символы H и W в верхнем регистре игнорируются, если они разделяют 2 согласные, которые имеют одинаковый номер в коде SOUNDEX.

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

Функция SOUNDEX реализует следующие правила.

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

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

Функция SOUNDEX реализует дополнительные правила, при применении которых значения, вычисляемые функцией, могут отличаться от тех значений, которые были вычислены при другом уровне совместимости. После обновления до уровня совместимости 110 может потребоваться перестроение индексов, куч или проверочных ограничений, которые используют функцию SOUNDEX. Дополнительные сведения см. в разделе SOUNDEX (Transact-SQL).

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

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

Настройка уровня совместимости

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

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.

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

Дополнительные сведения см. в разделе Зарезервированные ключевые слова (Transact-SQL).

Разрешения

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

Примеры

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

В следующем примере изменяется уровень совместимости базы данных AdventureWorks2012 до 110, SQL Server 2012.

ALTER DATABASE AdventureWorks2012
SET COMPATIBILITY_LEVEL = 110;
GO

См. также

Справочник

ALTER DATABASE (Transact-SQL)

Зарезервированные ключевые слова (Transact-SQL)

CREATE DATABASE (Transact-SQL)

DATABASEPROPERTYEX (Transact-SQL)

sys.databases (Transact-SQL)

sys.database_files (Transact-SQL)