sp_dbcmptlevel (Transact-SQL)

Изменения: 17 июля 2006 г.

Определяет поведение конкретных баз данных для совместимости с указанной версией SQL Server.

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

Синтаксис

sp_dbcmptlevel [ [ @dbname = ] name ] 
    [ , [ @new_cmptlevel = ] version ]

Аргументы

  • [ **@dbname=** ] name
    Имя базы данных, для которой должен быть изменен уровень совместимости. Имена баз данных должны соответствовать правилам для идентификаторов. Аргумент name имеет тип sysname и значение по умолчанию NULL.
  • [ **@new\_cmptlevel=** ] version
    Версия SQL Server, с которой должна быть совместима база данных. Аргумент version имеет тип tinyint и значение по умолчанию NULL. Значение должно быть одним из следующих:

    60 = SQL Server 6.0

    65 = SQL Server 6.5

    70 = SQL Server 7.0

    80 = SQL Server 2000

    90 = SQL Server 2005

    ms178653.note(ru-ru,SQL.90).gifПримечание.
    Значения 60 и 65 устарели и будут удалены в следующей версии.
    ms178653.Caution(ru-ru,SQL.90).gifВнимание!
    В среде SQL Server Management Studio с SQL Server SMO для уровня совместимости не поддерживается значение 60. Если используется SMO или среда Management Studio с базой данных с уровнем совместимости 60, то некоторые операции будут выдавать ошибки.

Результирующие наборы

Если аргументы не указаны, или если не указано значение аргумента name, процедура sp_dbcmptlevel возвращает ошибку.

Если аргумент name указан без аргумента version, то компонент SQL Server 2005 Database Engine возвращает сообщение, отображающее текущий уровень совместимости для указанной базы данных.

Замечания

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

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

Хранимая процедура sp_dbcmptlevel оказывает влияние на поведение только указанной базы данных, а не на весь сервер. Она обеспечивает лишь частичную обратную совместимость с более ранними версиями SQL Server. Используйте процедуру sp_dbcmptlevel как промежуточную меру в процессе устранения проблем, возникших из-за различий в поведении между версиями, управляемых соответствующей настройкой уровня совместимости. Если на существующие приложения SQL Server оказывают влияние различия поведения SQL Server 2005, настройте приложение для работы должным образом. Затем используйте процедуру sp_dbcmptlevel, чтобы изменить значение уровня совместимости на «90». Новая настройка уровня совместимости вступит в силу в следующий раз, когда база данных будет сделана текущей (либо как база данных по умолчанию при входе в систему, либо при указании в инструкции USE).

Уровень совместимости для базы данных, содержащей индексированное представление, не может быть изменен на значение меньше 80.

Наиболее оптимальные методы

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

  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, влияющие на результаты.

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

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

Замечания по окружению при использовании процедуры sp_dbcmptlevel

Каждый вызов процедуры sp_dbcmptlevel должен выполняться отдельно. Процедуру sp_dbcmptlevel нельзя вызывать из других контекстов, например:

  • хранимой процедуры;
  • строки на языке Transact-SQL, выполняемой инструкцией EXEC(string);
  • пакета инструкций Transact-SQL.

Отличия уровней 60 и 65 от уровней 70, 80 и 90

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

ms178653.note(ru-ru,SQL.90).gifПримечание.
Дополнительные сведения о различиях, влияющих на приложения версий 6.x, см. в подразделе «Различия между низкими уровнями совместимости и уровнем 90» далее в этом разделе, а также в подразделе, посвященном зарезервированным ключевым словам в версиях выше 6.x, раздела «Примечания».

Уровень совместимости 60 или 65

Уровень совместимости 70 или выше

Результирующие наборы инструкций SELECT с предложением GROUP BY и без предложения ORDER BY сортируются по столбцам GROUP BY.

Предложение GROUP BY не выполняет собственной сортировки. Предложение ORDER BY должно быть явно указано в SQL Server для сортировки какого-либо результирующего набора. Дополнительные сведения см. в разделе SELECT (Transact-SQL).

Столбцы, помеченные табличными псевдонимами, принимаются в предложении SET инструкции UPDATE.

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

Столбцы bit, созданные без явного указания параметра NULL или NOT NULL, в CREATE TABLE или ALTER TABLE создаются как NOT NULL.

Допустимость значения NULL для столбцов bit без явного указания такой допустимости определяется настройкой сеанса SET ANSI_NULL_DFLT_ON / SET ANSI_NULL_DFLT_OFF или настройкой базы данных SET ANSI NULL DEFAULT. Дополнительные сведения см. в разделе SET (Transact-SQL).

Предложение ALTER COLUMN не может использоваться в ALTER TABLE.

Предложение ALTER COLUMN может использоваться в ALTER TABLE. Дополнительные сведения см. в разделе ALTER TABLE (Transact-SQL).

Триггер, созданный для таблицы, заменяет собой любые существующие триггеры того же типа (INSERT, UPDATE, DELETE). Параметр WITH APPEND в CREATE TRIGGER может использоваться для создания нескольких триггеров одного и того же типа.

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

Если пакет или процедура содержит недопустимые имена объектов, возвращается предупреждение при анализе или компиляции пакета, а также возвращается сообщение об ошибке при выполнении пакета.

В случае с локальным недействительным объектом предупреждение не возвращается при анализе или компиляции пакета, но возвращается сообщение об ошибке при выполнении пакета.

Однако в случае с недопустимым удаленным объектом отложенное разрешение имен (DNR) не поддерживается. Если в процедуре используется недопустимая удаленная таблица, то при создании процедуры происходит сбой и возвращается ошибка.

ms178653.note(ru-ru,SQL.90).gifПримечание.

Поддержка DNR (возможность ссылаться при компиляции на объекты, которые не существуют до момента выполнения) применима только для имен таблиц или представлений. Дополнительные сведения об отложенном разрешении имен см. в разделе CREATE PROCEDURE (Transact-SQL).

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

INSERT X
SELECT select_list INTO Y

Microsoft SQL Server 7.0 или более поздние версии возвращают синтаксическую ошибку при выполнении точно такого же запроса.

Пустой строковый литерал (' ') рассматривается как одиночный пропуск.

Пустой строковый литерал (' ') рассматривается как пустая строка.

DATALENGTH('') возвращает 1 ('' рассматривается как одиночный пробел).

DATALENGTH(N'') возвращает 2 (N'' рассматривается как одиночный пробел в Юникоде).

DATALENGTH('') возвращает 0.

DATALENGTH(N'') возвращает 0.

LEFT('123', 0) возвращает NULL.

LEFT(N'123', 0) возвращает NULL.

LEFT('123', 0) возвращает пустую строку.

LEFT(N'123', 0) возвращает пустую строку.

LTRIM('     ') возвращает NULL.

LTRIM(N'     ') возвращает NULL.

LTRIM('     ') возвращает пустую строку.

LTRIM(N'     ') возвращает пустую строку.

REPLICATE('123', 0) возвращает NULL.

REPLICATE(N'123', 0) возвращает NULL.

REPLICATE('123', 0) возвращает пустую строку.

REPLICATE(N'123', 0) возвращает пустую строку.

RIGHT(N'123', 0) возвращает NULL. RIGHT('123', 0) возвращает NULL.

RIGHT('123', integer_expression) возвращает NULL, когда integer_expression является отрицательным.

RIGHT(N'123', integer_expression) возвращает NULL, когда integer_expression является отрицательным.

RIGHT('123', 0) возвращает пустую строку.

RIGHT(N'123', 0) возвращает пустую строку.

RIGHT('123', integer_expression) возвращает ошибку, когда integer_expression является отрицательным. RIGHT(N'123', integer_expression) возвращает ошибку, когда integer_expression является отрицательным.

RTRIM('     ') возвращает NULL.

RTRIM(N'     ') возвращает NULL.

RTRIM('     ') возвращает пустую строку.

RTRIM(N'     ') возвращает пустую строку.

SPACE(0) возвращает NULL.

SPACE(0) возвращает пустую строку.

Функция SUBSTRING(expression, start, length) возвращает значение NULL, если значениеstart больше, чем указано число символов в expression, или параметр length равен нулю; например выражение SUBSTRING(N'123', 4, 1) возвратит значение NULL.

В точно таких же условиях SUBSTRING(expression, start, length) возвращает пустую строку, выделенную парой одинарных кавычек; например: SUBSTRING(N'123', 4, 1) возвращает ''.

UPDATETEXT table.textcolumn textpointer 0 NULL NULL выдает значение NULL.

UPDATETEXT table.textcolumn textpointer 0 NULL NULL выдает пустой текст.

Функции CHARINDEX и PATINDEX возвращают значение NULL только в том случае, если и шаблон, и выражение имеют значение NULL.

Функции CHARINDEX и PATINDEX возвращают NULL в том случае, если любой из входных аргументов имеет значение NULL.

Ссылки на столбцы типа text или image во вставленных и удаленных таблицах отображаются как NULL.

Ссылки на столбцы типа text или image во вставленных и удаленных таблицах не допускаются.

Извлечение столбцов text или image из вставленных или удаленных таблиц внутри триггера возвращает значения NULL для столбцов text или image.

Извлечение столбцов text или image из вставленных или удаленных таблиц внутри триггера не допускается и вызывает ошибку.

Позволяет утверждению UPDATETEXT задать для столбцов text значение NULL.

UPDATETEXT задает для столбцов text значения в виде пустых строк.

WRITETEXT задает для столбцов text значение NULL.

Параметр concatenation of null yields null в процедуре sp_dboption отключен, в результате чего возвращается пустая строка, если любой операнд в операции сцепления имеет значение NULL.

Параметр concatenation of null yields null в процедуре sp_dboption включен, в результате чего возвращается NULL, если любой операнд в операции сцепления имеет значение NULL.

В инструкции INSERT в предложении VALUES допускается инструкция SELECT, возвращающая скалярное значение.

В инструкции INSERT не может содержаться инструкция SELECT в предложении VALUES в качестве одного из значений для вставки.

Инструкция ROLLBACK в хранимой процедуре, на которую ссылается инструкция INSERT таблица EXEC процедура, вызывает откат инструкции INSERT, однако выполнение пакета продолжается.

Инструкция ROLLBACK в хранимой процедуре, на которую ссылается инструкция INSERT...EXEC, вызывает откат всей транзакции, и выполнение пакета останавливается.

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

В этом подразделе описываются новые особенности поведения, представленные уровнем совместимости 90. Дополнительные сведения о поведенческих различиях, влияющих на уровень 80 и более низкие уровни совместимости, см. в подразделе «Зарезервированные ключевые слова» далее в этом разделе.

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

Средняя

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

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

Средняя

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

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

Средняя

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

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

Средняя

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 имеет значение 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-байтовые) в именах представлены с использованием 6 позиций.

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

<a_x010000_ c1="1" />

Низкая

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

Пример.

USE AdventureWorks
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;

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

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

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

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

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

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

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

Дополнительные сведения об изменениях режима AUTO см. в разделе Расширения режима AUTO.

Высокая (если в представлениях применен режим 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 с тем же определением.

ms178653.note(ru-ru,SQL.90).gifПримечание.

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

Низкая

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

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

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

Низкая

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

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

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

Низкая

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

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

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

Низкая

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

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

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

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

Низкая

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

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

Низкая

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

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

Низкая

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

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

Настройка уровня совместимости Зарезервированные ключевые слова

90

EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE

80

COLLATE, FUNCTION, OPENXML

70

BACKUP, CONTAINS, CONTAINSTABLE, DENY, FREETEXT, FREETEXTTABLE, PERCENT, RESTORE, ROWGUIDCOL, TOP

65

AUTHORIZATION, CASCADE, CROSS, DISTRIBUTED, ESCAPE, FULL, INNER, JOIN, LEFT, OUTER, PRIVILEGES, RESTRICT, RIGHT, SCHEMA, WORK

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

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

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

Разрешения

Только владелец базы данных, члены предопределенной роли сервера sysadmin и предопределенной роли базы данных db_owner (при изменении текущей базы данных) могут выполнять эту процедуру.

Значения кода возврата

0 (успешное завершение) или 1 (ошибка)

Примеры

А. Изменение уровня совместимости до SQL Server 2000

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

EXEC sp_dbcmptlevel AdventureWorks, 80;
GO

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

В следующем примере проиллюстрированы различия в привязке ORDER BY для уровней совместимости 80 и 90. В этом примере создается образец таблицы (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 выполняется успешно.

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c1
    FROM SampleTable
    ORDER BY c1;
GO

Следующая инструкция SELECT... ORDER BY работает при обоих уровнях совместимости.

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

sp_dbcmptlevel tempdb, 90
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 выполнится успешно.

sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
    FROM SampleTable
    ORDER BY SampleTable.x;
GO

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

sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
    FROM SampleTable
    ORDER BY x;
GO
sp_dbcmptlevel tempdb, 90
SELECT c1 AS x
    FROM SampleTable
    ORDER BY x;
GO

См. также

Справочник

Хранимые процедуры ядра СУБД (Transact-SQL)
ALTER DATABASE (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
EXECUTE (Transact-SQL)
Зарезервированные ключевые слова (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
Системные хранимые процедуры (Transact-SQL)
UPDATE (Transact-SQL)

Другие ресурсы

Параметр Database Compatibility Level
Новые возможности FOR XML
Установка параметров базы данных
Использование параметров в СУБД SQL Server

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

17 июля 2006 г.

Обновления
  • Удалено предложение «Уровень совместимости базы данных master не может быть изменен».

14 апреля 2006 г.

Добавления
  • Добавлен раздел «Советы и рекомендации».
  • Добавлены сведения о поведении GROUP BY во вложенных запросах.