CREATE TYPE (Transact-SQL)

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

ПримечаниеПримечание

Возможность выполнения 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 ] 
  | AS TABLE ( { <column_definition> | <computed_column_definition> }
        [ <table_constraint> ] [ ,...n ] )  
} [ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ] 
    [ NULL | NOT NULL ]
    [ 
        DEFAULT constant_expression ] 
      | [ IDENTITY [ ( seed ,increment ) ] 
    ]
    [ ROWGUIDCOL ] [ <column_constraint> [ ...n ] ] 

<data type> ::= 
[ type_schema_name . ] type_name 
    [ ( precision [ , scale ] | max | 
                [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ] 

<column_constraint> ::= 
{     { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
        [ 
            WITH ( <index_option> [ ,...n ] ) 
        ]
  | CHECK ( logical_expression ) 
} 

<computed_column_definition> ::=
column_name AS computed_column_expression 
[ PERSISTED [ NOT NULL ] ]
[ 
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [ 
            WITH ( <index_option> [ ,...n ] )
        ]
    | CHECK ( logical_expression ) 
] 

<table_constraint> ::=
{ 
    { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
                              ( column [ ASC | DESC ] [ ,...n ] ) 
        [ 
           WITH ( <index_option> [ ,...n ] ) 
        ]
    | CHECK ( logical_expression ) 
} 

<index_option> ::=
{ 
    IGNORE_DUP_KEY = { ON | OFF } 
}

Аргументы

  • schema_name
    Имя схемы, к которой относится псевдоним типа данных или определяемый пользователем тип данных.

  • type_name
    Имя псевдонима типа данных или определяемого пользователем типа данных. Имена типов должны соответствовать требованиям к именам идентификаторов.

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

    bigint

    binary(n)

    bit

    char(n)

    date

    datetime

    datetime2

    datetimeoffset

    decimal

    float

    image

    int

    money

    nchar(n)

    ntext

    numeric

    nvarchar(n| max)

    real

    smalldatetime

    smallint

    smallmoney

    sql_variant

    text

    time

    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.

  • <column_definition>
    Определяет столбцы для определяемого пользователем табличного типа. Дополнительные сведения о столбцах см. в разделе Добавление и удаление столбцов.

  • <тип данных>
    Определяет тип данных в столбце для определяемого пользователем табличного типа. Дополнительные сведения о типах данных см. в разделе Типы данных (Transact-SQL). Дополнительные сведения о таблицах см. в разделе Инструкция CREATE TABLE (Transact-SQL).

  • <column_constraint>
    Определяет ограничения столбца для определяемого пользователем табличного типа. Из ограничений поддерживаются PRIMARY KEY, UNIQUE и CHECK. Дополнительные сведения об ограничениях см. в разделе Принудительное обеспечение целостности данных. Дополнительные сведения о таблицах см. в разделе Инструкция CREATE TABLE (Transact-SQL).

  • <computed_column_definition>
    Определяет выражение вычисляемого столбца в качестве столбца в определяемом пользователем табличном типе. Дополнительные сведения о вычисляемых столбцах см. в разделе Вычисляемые столбцы. Дополнительные сведения о таблицах см. в разделе Инструкция CREATE TABLE (Transact-SQL).

  • <table_constraint>
    Определяет ограничение таблицы на основе определяемого пользователем табличного типа. Из ограничений поддерживаются PRIMARY KEY, UNIQUE и CHECK. Дополнительные сведения об ограничениях таблиц см. в разделе Ограничения.

  • <index_option>
    Определяет реакцию на ошибку, возникшую из-за дублирования значений ключа при вставке нескольких строк в уникальный кластеризованный или уникальный некластеризованный индекс. Дополнительные сведения о параметрах индекса см. в разделе CREATE INDEX (Transact-SQL).

Замечания

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

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

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

  • данный класс может иметь перегруженные методы, но эти методы могут вызываться только из управляемого кода, а не с помощью языка 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 автоматически. Это разрешение должно предоставляться отдельно.

В определяемых пользователем табличных типах определяемые пользователем структурированные типы, используемые в column_name <тип данных>, представляют собой часть области схемы базы данных, в которой определен тип таблицы. Чтобы получить доступ к определяемым пользователем структурированным типам в другой области базы данных, используйте двухкомпонентные имена.

В определяемых пользователем табличных типах первичный ключ на вычисляемых столбцах должен иметь атрибуты PERSISTED и NOT NULL.

Разрешения

Требует разрешения 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

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

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

/* Create a user-defined table type */
CREATE TYPE LocationTableType AS TABLE 
    ( LocationName VARCHAR(50)
    , CostRate INT )
GO