CREATE TYPE (Transact-SQL)

Изменения: 14 апреля 2006 г.

Создает псевдоним типа данных или определяемый пользователем тип данных в экземпляре SQL Server 2005. Реализация псевдонима типа данных основывается на собственном системном типе SQL Server. Пользовательский тип реализуется с помощью класса сборки в среде Microsoft.NET Framework CLR. Для привязки пользовательского типа к его реализации средствами SQL Server 2005 сборка среды CLR, содержащая реализацию данного типа, должна быть сначала зарегистрирована в SQL Server с помощью инструкции CREATE ASSEMBLY.

ms175007.note(ru-ru,SQL.90).gifПримечание.
Возможность выполнения CLR-кода в SQL Server отключена по умолчанию. Можно создавать, изменять и удалять объекты базы данных, которые ссылаются на модули управляемого кода, но эти ссылки не будут действовать в SQL Server, если параметр clr enabled не включен с помощью процедуры sp_configure.

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

Синтаксис

CREATE TYPE [ schema_name. ] type_name
{ 
    FROM base_type 
    [ ( precision [ , scale ] )  ]
    [ NULL | NOT NULL ] 
  | EXTERNAL NAME assembly_name [ .class_name ] 
} [ ; ]

Аргументы

  • schema_name
    Имя схемы, к которой относится псевдоним типа данных или определяемый пользователем тип данных.
  • type_name
    Имя псевдонима типа данных или определяемого пользователем типа данных. Имена типов должны соответствовать требованиям к именам идентификаторов.
  • base_type
    Предоставляемый SQL Server тип данных, на основе которого формируется псевдоним. Аргумент base_type имеет тип sysname. Он не имеет значения по умолчанию и может принимать одно из следующих значений.

    bigint

    binary(n)

    bit

    char(n)

    datetime

    decimal

    float

    image

    int

    money

    nchar(n)

    ntext

    numeric

    nvarchar(n | max)

    real

    smalldatetime

    smallint

    smallmoney

    sql_variant

    text

    tinyint

    uniqueidentifier

    varbinary(n | max)

    varchar(n | max)

    Тип base_type может быть также синонимом любого типа данных, преобразуемого в один из следующих типов системных данных.

  • precision
    Для decimal или numeric является неотрицательным целым числом, которое указывает на максимальное общее число подлежащих сохранению десятичных знаков как слева, так и справа от десятичного разделителя, отделяющего десятичную дробь от целого числа. Дополнительные сведения см. в разделе десятичные и числовые (Transact-SQL).
  • scale
    Для decimal или numeric является неотрицательным целым числом, которое указывает на максимальное общее число подлежащих сохранению десятичных знаков справа от разделителя, отделяющего десятичную дробь от целого числа. Его значение должно быть меньшим или равным заданной степени точности. Дополнительные сведения см. в разделе десятичные и числовые (Transact-SQL).
  • NULL | NOT NULL
    Указывает, может ли данный тип иметь значение NULL. Если не указано иное, по умолчанию принимается значение NULL.
  • assembly_name
    Указывает на сборку SQL Server, которая ссылается на реализацию пользовательского типа в среде CLR. Аргумент assembly_name должен соответствовать существующей сборке в SQL Server в текущей базе данных.
  • **[.**class_name ]
    Указывает класс внутри сборки, реализующий определяемый пользователем тип. Аргумент class_name должен быть допустимым идентификатором и существовать как класс внутри сборки с видимостью в пределах сборки. Аргумент class_name чувствителен к регистру независимо от параметров сортировки базы данных. Он должен точно соответствовать имени класса в соответствующей сборке. Именем класса может быть заключенное в квадратные кавычки ([]) имя с указанием пространства имен, если в языке программирования, на котором написан класс, используется концепция пространств имен, как например в языке C#. Если аргумент class_name не задан, SQL Server считает, что его значение равно значению аргумента type_name.

Замечания

Если инструкция CREATE TYPE используется для создания определяемого пользователем типа данных CLR, уровень совместимости базы данных должен быть 90.

И класс сборки, ссылка на который содержится в assembly_name, и его методы должны удовлетворять требованиям, предъявляемым при реализации определяемых пользователем типов в SQL Server. Дополнительные сведения об этих требованиях см. в разделе CLR User-Defined Types.

К числу дополнительных соображений относятся следующие:

  • данный класс может иметь перегруженные методы, но эти методы могут вызываться только из управляемого кода, а не с помощью языка Transact-SQL;
  • все статические члены должны быть объявлены как const или readonly, если параметр assembly_name имеет значение SAFE или EXTERNAL_ACCESS.

Внутри базы данных может существовать только один определяемый пользователем тип, зарегистрированный на основе любого указанного типа, который был загружен в SQL Server из CLR. Если определяемый пользователем тип создается на основе типа CLR, для которого в этой базе данных уже существует пользовательский тип, инструкция CREATE TYPE вызывает сбой. Это ограничение необходимо для того, чтобы избежать неоднозначности при разрешении типа SQL Type, если тип CLR может соответствовать более чем одному определяемому пользователем типу.

Если какой-либо метод-мутатор в данном типе не возвращает значения void, инструкция CREATE TYPE не выполняется.

Чтобы внести изменения в определяемый пользователем тип, нужно удалить этот тип с помощью инструкции DROP TYPE и затем снова создать его.

Если для определяемых пользователем типов, созданных с помощью sp_addtype, разрешение REFERENCES на типы, созданные с помощью инструкции CREATE TYPE, не предоставляется роли базы данных public автоматически. Это разрешение должно предоставляться отдельно.

Разрешения

Требует разрешения CREATE TYPE в текущей базе данных и разрешения ALTER для схемы schema_name. Если аргумент schema_name не указан, в действие вступают принимаемые по умолчанию правила разрешения имен с целью определения схемы для текущего пользователя. Если аргумент assembly_name указан, пользователь должен либо быть владельцем данной сборки, либо иметь разрешение REFERENCES для работы с ней.

Примеры

A. Создание псевдонима на базе типа данных varchar

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

CREATE TYPE SSN
FROM varchar(11) NOT NULL ;

Б. Создание определяемого пользователем типа

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

CREATE ASSEMBLY utf8string
FROM '\\ComputerName\utf8string\utf8string.dll' ;
GO
CREATE TYPE Utf8String 
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;
GO

См. также

Справочник

CREATE ASSEMBLY (Transact-SQL)
DROP TYPE (Transact-SQL)
EVENTDATA (Transact-SQL)

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

Работа с псевдонимами типов данных
Работа с определяемыми пользователем типами данных CLR

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

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

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

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

14 апреля 2006 г.

Новое содержимое.
  • В подразделе «Примечания» добавлено предложение, определяющее, что если инструкция CREATE TYPE используется для создания определяемого пользователем типа данных CLR, уровень совместимости базы данных должен быть 90.
  • В подраздел «Аргументы» для аргумента [.class_name ] внесено добавление о том, что если аргумент class_name не задан, SQL Server считает, что его значение равно значению аргумента type_name.