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


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

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

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

Синтаксис

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

Аргументы

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

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

    80 = SQL Server 2000 

    90 = SQL Server 2005 

    100 = SQL Server 2008 

Замечания

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

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

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

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

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

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

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

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

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

Параметры SET

Новые функциональные возможности смогут работать и при старых значениях уровня совместимости, однако параметрам SET может понадобиться настройка. Например, применение типа данных xml при уровне совместимости 80 требует соответствующих параметров ANSI SET. Кроме того, при значении уровня совместимости 90 или больше установка параметра ANSI_WARNINGS в состояние ON косвенно влечет за собой и установку параметра ARITHABORT в значение ON. Если уровень совместимости базы данных установлен равным 80, для параметра ARITHABORT необходимо явно задать значение ON. Дополнительные сведения см. в разделе Параметры SET, влияющие на результаты.

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

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

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

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

На уровне совместимости 90 происходят следующие изменения в поведении.

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

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

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

Для подсказок блокировки в предложении FROM ключевое слово WITH всегда является необязательным.

Табличные подсказки, за некоторыми исключениями, поддерживаются в предложении FROM только в случае, когда подсказки указаны с ключевым словом WITH. Дополнительные сведения см. в разделе FROM (Transact-SQL).

Высокая

Операторы *= and =* для внешнего соединения поддерживаются с предупреждающим сообщением.

Эти операторы не поддерживаются; следует использовать ключевое слово OUTER JOIN.

Высокая

При привязке ссылок столбцов в списке ORDER BY к столбцам, определенным в списке SELECT, неоднозначность столбцов не учитывается, иногда не учитываются и префиксы столбцов. Это может привести к тому, что результирующий набор придет в непредвиденном порядке.

Например, предложение ORDER BY, в котором единственный столбец с именем из двух частей (<table_alias>.<column>) используемый в качестве ссылки на столбец в списке SELECT, принимается, но псевдоним таблицы не учитывается. Рассмотрим следующий запрос.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

При исполнении префикс столбца не учитывается в предложении ORDER BY. Операция сортировки не проводится по указанному исходному столбцу (x.c1), как ожидалось; вместо этого она проводится в производном столбце c1, который определяется в запросе. План выполнения этого запроса показывает, что сначала вычисляются значения производного столбца, а затем вычисленные значения сортируются.

Ошибки выдаются из-за неоднозначности столбцов. Префиксы столбцов, если таковые имеются, указанные в предложении ORDER BY, будут учитываться при привязке к столбцам, определенным в списке SELECT.

Рассмотрим следующий запрос.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

При исполнении префикс столбца учитывается в предложении ORDER BY. Операция сортировки проводится в исходном столбце (x.c1), как и ожидалось. План выполнения этого запроса показывает, что оператор сортировки упорядочивает строки, возвращаемые из t_table, а затем вычисляются значения для производного столбца c1, определенного в списке SELECT. В данном случае порядок следования результатов может отличаться от результатов, возвращенных в SQL Server 2000. Чтобы добиться того же порядка следования результатов в SQL Server 2000, удалите префикс столбца в предложении ORDER BY.

Средний

В утверждении INSERT SELECT из объединения UNION разных типов данных каждая ветвь UNION напрямую преобразуется в тип целевого столбца INSERT. Даже если объединение само по себе может завершиться неудачно из-за преобразований несовместимых типов, инструкция INSERT SELECT сделает UNION успешным, поскольку ветвь типа результата UNION никогда не преобразуется.

Тип результата UNION извлекается независимо от INSERT SELECT. Каждая ветвь UNION преобразуется в тип результата UNION, а затем преобразуется в тип целевого столбца INSERT. Если в UNION присутствуют несовместимые типы, первое преобразование может привести к ошибке. Чтобы работать с уровнем совместимости 90, необходимо исправить все объединения несовместимых типов, используемые внутри INSERT SELECT.

Средняя

Операции вставки и обновления через представление неправильно выполняются в тех представлениях, в которых указано предложение WITH CHECK OPTION, когда представление или ссылочное представление использует предложение TOP.

Операции вставки и обновления через представление не поддерживаются в тех представлениях, в которых указано предложение WITH CHECK OPTION, когда представление или ссылочное представление использует предложение TOP.

Средняя

UNION столбца переменной длины и столбца фиксированной длины выдает столбец фиксированной длины.

Выражение CASE возвращает тип фиксированной длины (char), если оно включает значения char и varchar.

UNION столбца переменной длины и столбца фиксированной длины выдает столбец переменной длины.

Выражение CASE возвращает тип переменной длины (varchar), если оно включает значения char и varchar.

Средний

SET XACT_ABORT OFF допускается внутри триггера.

SET XACT_ABORT OFF не допускается внутри триггера.

Средняя

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

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

Средняя

Ошибки домена не контролируются ANSI_WARNINGS. Настройки ARITHABORT соблюдаются, если для ANSI_WARNINGS установлено значение OFF и если нет изменений в ARITHABORT.

Ошибки домена также контролируются ANSI_WARNINGS и являются ошибками уровня серьезности 16. Если установлено значение ON либо для ANSI_WARNINGS, либо для ARITHABORT, вместо возвращения значения NULL выдается ошибка. Пользовательские сценарии, зависящие от ARITHABORT, установленного на OFF, могут быть нарушены таким изменением.

Средняя

Если сквозной запрос в отношении удаленного источника данных [OpenRowset или OpenQuery] выдает столбцы с дублирующимися именами, эти имена пропускаются, если не названы явным образом в запросе.

Если транзитный запрос в отношении удаленного источника данных [OpenRowset или OpenQuery] выдает столбцы с дублирующимися именами, возникает ошибка.

Низкая

Константы символьных строк и константы varbinary размером больше 8000 рассматриваются как text, ntext или image.

Константы символьных строк и константы varbinary размером больше 8000 рассматриваются как тип varchar(max) (или nvarchar(max) и varbinary(max) соответственно). Это может изменить тип данных таблицы, созданной с использованием SELECT … INTO, если список SELECT содержит такие выражения.

Низкий

Сравнения между числовыми типами (smallint, tinyint, int, bigint, numeric, decimal, smallmoney, money) выполняются посредством преобразования компаранда, имеющего более низкий приоритет в иерархии типов, в тип, приоритет которого выше.

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

Малая

Встроенные функции метаданных, принимающие строковые аргументы, усекают входные данные, если длина входных данных превышает 4 000 знаков.

Встроенные функции метаданных, использующие строковые аргументы, выдают ошибку, если усечение вывода привело бы к потере знаков, отличных от пробела.

Малая

Набор запрещенных знаков в идентификаторе, не помещенном в кавычки, остается без изменения.

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

Малая

SET ANSI_WARNINGS ON не перекрывает настройку SET ARITHABORT OFF в случае ошибок домена плавающей запятой [т.е. отрицательных аргументов для функции log()]. Если для ANSI_WARNINGS установлено значение ON, но для ARITHABORT установлено значение OFF, ошибки домена плавающей запятой не влекут прекращение выполнения запроса.

SET ANSI_WARNINGS ON полностью перекрывает настройку ARITHABORT OFF. Ошибки домена плавающей запятой в таком случае влекут прекращение выполнения запроса.

Малая

Нецелочисленные константы допускаются (и не учитываются) в предложении ORDER BY.

Нецелочисленные константы не допускаются в предложении ORDER BY.

Малая

Пустая инструкция SET (без присвоения значений параметру SET) допускается.

Пустое предложение SET не допускается.

Малая

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

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

Малая

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

Допустимость значения NULL для арифметических операторов относительно типа данных с плавающей запятой меняется на недопустимость в случае, если входные значения не допускают значений NULL, а параметр ANSI_WARNINGS или ARITHABORT установлен в значение ON.

Низкий

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

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

Малая

В инструкции SELECT .. FOR XML значения hex(27) (знак ') и hex(22) (знак ") всегда преобразуются в сущности, даже там, где этого не требуется.

Предложение FOR XML преобразует знаки hex(27) и hex(22) в сущности только там, где это необходимо. Они не преобразуются в сущности в следующих ситуациях.

  • В содержимом атрибута hex(27) (символ ') не преобразуется в сущность, если значения атрибутов ограничены символом ", и hex(22) (символ ") не преобразуется в сущность, если значения атрибутов выделены символом '.

  • В содержимом элемента символы hex(27) и hex(22) никогда не преобразуются в сущность.

Малая

В инструкции FOR XML значение timestamp сопоставляется с целым числом.

В инструкции FOR XML значение timestamp сопоставляется с двоичным значением.

Дополнительные сведения см. в разделе Поддержка режима FOR XML для типа данных timestamp.

Высокая (если применяется столбец типа timestamp), в противном случае низкая

В инструкциях FOR XML и OPENXML символы Юникода из старших диапазонов (3-байтовые) в именах представлены с использованием 8 позиций.

Например, элемент кода U+10000 в режиме FOR XML имеет следующее 8-позиционное представление.

<a_x00010000_ c1="1" />

В инструкциях FOR XML и OPENXML символы Юникода из старших диапазонов (3-байтовые) в именах представлены с использованием 8 позиций.

Например, элемент кода U+10000 в режиме FOR XML имеет следующее 6-позиционное представление.

<a_x010000_ c1="1" />

Малая

В утверждении FOR XML сопоставления производной таблицы в режиме AUTO трактуются явным образом.

Например:

USE AdventureWorks2008R2;
CREATE TABLE Test(id int);
INSERT INTO Test VALUES(1);
INSERT INTO Test VALUES(2);
SELECT * FROM (SELECT a.id AS a, 
b.id AS b FROM Test a 
JOIN Test b ON a.id=b.id) 
Test FOR XML AUTO;

Когда уровень совместимости для База данных AdventureWorks2008R2 устанавливается равным 80, приведенный выше пример дает следующий результат.

<a a="1"><b b="1"/></a>

<a a="2"><b b="2"/></a>

В утверждении FOR XML сопоставления производной таблицы в режиме AUTO трактуются неявным образом.

Когда уровень совместимости для База данных AdventureWorks2008R2 устанавливается равным 90, предыдущий пример дает следующий результат.

<Test a="1" b="1"/>

<Test a="2" b="2"/>

Высокая (если в представлениях применен режим FOR XML AUTO); иначе низкая

Преобразования строки в money поддерживают использование знака обратной косой черты (\) в качестве символа валюты только для японского и корейского языков.

Знак обратной косой черты (\) допустим для всех преобразований строки в money во всех языках. ISNUMERIC возвращает значение TRUE, если знак обратной косой черты (\) используется в качестве символа валюты.

Для баз данных SQL Server, работающих на более ранних версиях, чем SQL Server 2005, такое новое поведение разрушает индексы и вычисляемые столбцы, которые зависят от возвращаемого значения ISNUMERIC, содержащего «\» и не использующего японский или корейский язык.

Малая

Для результата арифметического оператора всегда допустимо значение NULL, даже если для операндов значение NULL недопустимо и для ANSI_WARNINGS или ARITHABORT установлено значение ON.

Когда для ANSI_WARNINGS или ARITHABORT установлено значение ON, для результата арифметического оператора с плавающей запятой недопустимо значение NULL, если для обоих операндов недопустимо значение NULL.

Эти изменения в допустимости значения NULL приводят к ошибке при массовом экспорте данных в двоичном формате с помощью инструкции bcp из таблицы SQL Server 2000 с вычисляемым столбцом, в котором используется арифметический оператор с плавающей запятой, и bcp или BULK INSERT затем используется для массового импорта этих данных в таблицу SQL Server 2005 с тем же определением.

ПримечаниеПримечание
Если обоим параметрам присвоено значение OFF, компонент Database Engine помечает результат как допускающий значение NULL. Аналогично тому, как это делается в SQL Server 2000.

Малая

Для встроенных функций, принимающих nvarchar в качестве аргумента, если предоставленное значение является varchar, оно преобразуется в nvarchar(4000). В SQL Server 2000 при передаче большего значения происходит усечение по умолчанию.

Для встроенных функций, принимающих nvarchar в качестве аргумента, если предоставленное значение является varchar, оно, тем не менее, преобразуется в nvarchar(4000). Однако если передается большее значение, то SQL Server 2008 выдает ошибку.

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

Малая

Объединение строки фиксированной длины (с типом данных char, binary или nchar) со строкой переменной длины (и типом данных varchar, varbinary, nvarchar) возвращает результат фиксированной длины.

Объединение строки переменной длины и строки фиксированной длины возвращает строку переменной длины.

Чтобы работать с уровнем совместимости 90, необходимо исправить все позиции (индексы, запросы и вычисляемые столбцы), зависящие от типа, получаемого в результате объединения типа переменного размера и типа фиксированного размера.

Малая

Имена объектов, содержащие знак 0xFFFF, являются допустимыми идентификаторами.

Имена объектов, содержащие знак 0xFFFF, не являются допустимыми идентификаторами, и к ним не может осуществляться доступ.

Чтобы работать с уровнем совместимости 90, необходимо переименовать объекты, имена которых содержат этот знак.

Малая

В предложении SELECT ISNUMERIC('<string>') внедренные запятые внутри <string> имеют большое значение.

Например, следующий запрос SELECT ISNUMERIC('121212,12') возвращает 0. Это указывает, что строка 121212,12 не является числовой.

В предложении SELECT ISNUMERIC('<string>') внедренные запятые внутри <string> не учитываются.

Например, следующий запрос SELECT ISNUMERIC('121212,12') возвращает 1. Это указывает, что строка 121212,12 является числовой.

Малая

Двоеточие (:) за зарезервированным ключевым словом в инструкции Transact-SQL не учитывается.

Двоеточие (:) за зарезервированным ключевым словом в инструкции Transact-SQL приводит к ошибке.

Малая

Предложение GROUP BY во вложенном запросе, который ссылается на столбец из внешнего запроса, успешно выполняется.

Предложение GROUP BY во вложенном запросе, который ссылается на столбец из внешнего запроса, возвращает ошибку, как того требует стандарт SQL.

Малая

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

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

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

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

DECLARE @v int;
SELECT @v = EmployeeID FROM 
    (SELECT EmployeeID FROM HumanResources.Employee
     UNION ALL
     SELECT EmployeeID 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 при использовании недопустимого литерала даты и времени.

Малая

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

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

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

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

100

CUBE, MERGE, ROLLUP

90

EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE.

80

COLLATE, FUNCTION, OPENXML.

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

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

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

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

Разрешения

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

Примеры

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

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

ALTER DATABASE AdventureWorks2008R2
SET COMPATIBILITY_LEVEL = 90;
GO

Б. Влияние уровня совместимости на ORDER BY (сценарий 1)

В следующем примере проиллюстрированы различия в привязке ORDER BY для уровней совместимости 80 и 100. В этом примере создается образец таблицы (SampleTable) в базе данных tempdb.

USE tempdb;
CREATE TABLE SampleTable(c1 int, c2 int);
GO

На уровне совместимости 90 и выше (уровень по умолчанию) инструкция SELECT... ORDER BY формирует ошибку, поскольку имя столбца в предложении AS (c1) является неоднозначным.

SELECT c1, c2 AS c1
FROM SampleTable
ORDER BY c1;
GO

После изменения уровня совместимости базы данных на 80 та же самая инструкция SELECT... ORDER BY выполняется успешно.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1, c2 AS c1
FROM SampleTable
ORDER BY c1;
GO

Следующая инструкция SELECT... ORDER BY успешно выполняется на обоих уровнях совместимости, поскольку в предложении AS задан однозначный псевдоним.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 100;
GO
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

В. Влияние уровня совместимости на ORDER BY (сценарий 2)

На уровне совместимости 90 и на более высоком, применяемом по умолчанию уровне, выполнение следующей инструкции SELECT...ORDER BY приводит к формированию ошибки, поскольку псевдоним столбца, указанный в предложении ORDER BY, содержит префикс таблицы.

SELECT c1 AS x
FROM SampleTable
ORDER BY SampleTable.x;
GO

После того как база данных будет переведена на уровень совместимости 80, та же самая инструкция SELECT...ORDER BY выполнится успешно.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1 AS x
FROM SampleTable
ORDER BY SampleTable.x;
GO

Следующая инструкция SELECT...ORDER BY успешно выполняется на обоих уровнях совместимости, поскольку из псевдонима столбца, указанного в предложении ORDER BY, удален префикс таблицы.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 100;
GO
SELECT c1 AS x
FROM SampleTable
ORDER BY x;
GO
ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1 AS x
FROM SampleTable
ORDER BY x;
GO