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


sp_dbcmptlevel (Transact-SQL)

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

Важное примечаниеВажно!

В будущей версии Microsoft SQL Server эта возможность будет удалена. Не используйте ее при работе над новыми приложениями и как можно быстрее измените приложения, в которых она в настоящее время используется. Используйте вместо этого Уровень совместимости инструкции ALTER DATABASE.

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

Синтаксис

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

Аргументы

  • [ @dbname= ] name
    Имя базы данных, для которой должен быть изменен уровень совместимости. Имена баз данных должны соответствовать правилам для идентификаторов. Аргумент name имеет тип sysname и значение по умолчанию NULL.

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

    80 = SQL Server 2000

    90 = SQL Server 2005

    100 = SQL Server 2008

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

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

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

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

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

Замечания

Описание уровней совместимости см. в разделе Уровень совместимости инструкции ALTER DATABASE (Transact-SQL).

Разрешения

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

Примеры

А. Изменение уровня совместимости до 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