CREATE TYPE (Transact-SQL)

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

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

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Azure (с первоначального выпуска по текущий выпуск).

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

Синтаксис

Disk-Based Type Syntax
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 }
}

Memory-Optimized Table Type Syntax
CREATE TYPE [schema_name. ] type_name
AS TABLE ( { <column_definition> }
    |  [ <table_constraint> ] [ ,... n ]
    | [ <table_index> ] [ ,... n ]
    } )
    [ WITH ( <table_option> [ ,... n ] ) ]

 [ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
   [ NULL | NOT NULL ]
    [
      [ IDENTITY [ (1 , 1) ]
    ]
    [ <column_constraint> [ ... n ] ]
    [ <column_index> ]

<data type> ::=
 [type_schema_name . ] type_name [ (precision [ , scale ]) ]

<column_constraint> ::=
{ PRIMARY KEY { NONCLUSTERED HASH WITH (BUCKET_COUNT = bucket_count) | NONCLUSTERED } }

< table_constraint > ::=
{ PRIMARY KEY { NONCLUSTERED HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count) |  NONCLUSTERED  (column [ ASC | DESC ] [ ,... n ] )  } }

<column_index> ::=
  INDEX index_name
{ { [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count) | NONCLUSTERED } }

< table_index > ::=
  INDEX constraint_name
{ { [ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count) |  [NONCLUSTERED]  (column [ ASC | DESC ] [ ,... n ] )} }

<table_option> ::=
{
    [MEMORY_OPTIMIZED = {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 является неотрицательным целым числом, которое указывает на максимальное общее число подлежащих сохранению десятичных знаков как слева, так и справа от десятичного разделителя, отделяющего десятичную дробь от целого числа. Дополнительные сведения см. в разделе decimal и numeric (Transact-SQL).

  • scale
    Для типа decimal или numeric является неотрицательным целым числом, которое указывает на максимальное общее число подлежащих сохранению десятичных знаков справа от разделителя, отделяющего десятичную дробь от целого числа. Значение должно быть меньше или равно заданной степени точности. Дополнительные сведения см. в разделе decimal и numeric (Transact-SQL).

  • NULL | NOT NULL
    Указывает, может ли данный тип иметь значение NULL. Если не указано иное, по умолчанию принимается значение NULL.

  • assembly_name

    Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

    Указывает на сборку SQL Server, которая ссылается на реализацию определяемого пользователем типа в среде CLR. Аргумент assembly_name должен соответствовать существующей сборке в SQL Server в текущей базе данных.

    Примечание

    Параметр EXTERNAL_NAME недоступен в автономной базе данных.

  • [. class_name ]

    Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

    Задает класс сборки, реализующей определяемый пользователем тип. Аргумент class_name должен быть допустимым идентификатором и существовать как класс сборки в области видимости сборки. Аргумент class_name учитывает регистр символов независимо от параметров сортировки, установленных в библиотеке. Его значение должно точно соответствовать имени класса в соответствующей сборке. Именем класса может быть заключенное в квадратные скобки ([]) имя с указанием пространства имен, если в языке программирования, на котором записан класс, используется концепция пространств имен, как, например, в языке C#. Если аргумент class_name не задан, SQL Server считает, что его значение равно значению аргумента type_name.

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

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

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

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

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

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

  • INDEX
    Индексы столбцов и таблиц необходимо указывать в составе инструкции CREATE TABLE. DROP INDEX и CREATE INDEX не поддерживаются для таблиц, оптимизированных для памяти.

  • MEMORY_OPTIMIZED

    Применимо для следующих объектов: С SQL Server 2014 по SQL Server 2014 включительно.

    Указывает, является ли тип таблицы оптимизированным для памяти. Этот параметр по умолчанию выключен. Таблица (тип) не является таблицей (типом), оптимизированной для памяти. Оптимизированные для памяти типы таблицы — это оптимизированные для памяти пользовательские таблицы, схемы которых, как и схемы других пользовательских таблиц, сохраняются на диске. Доступ к оптимизированным для памяти типам таблиц можно осуществлять только из скомпилированных в собственном коде хранимых процедур.

  • BUCKET_COUNT

    Применимо для следующих объектов: С SQL Server 2014 по SQL Server 2014 включительно.

    Отображает число контейнеров, которые необходимо создать в хэш-индексе. Максимальное значение для параметра BUCKET_COUNT в хэш-индексах составляет 1 073 741 824. Дополнительные сведения о подсчете числа контейнеров см. в разделе Определение правильного числа контейнеров для хэш-индексов. bucket_count является обязательным аргументом.

  • HASH

    Применимо для следующих объектов: С SQL Server 2014 по SQL Server 2014 включительно.

    Указывает, что был создан индекс HASH. Хэш-индексы поддерживаются только в таблицах, оптимизированных для памяти.

Замечания

И класс сборки, ссылка на который содержится в 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.

Оптимизированные для памяти типы таблиц

Начиная с версии SQL Server 2014, обработка данных в типе таблицы может выполняться в основной памяти, но не на диске. Дополнительные сведения см. в разделе In-Memory OLTP (оптимизация в памяти). Образцы кода, которые показывают, как создавать табличные типы, оптимизированные для памяти, см. в разделе Создание таблиц, оптимизированных для памяти, и хранимых процедур, скомпилированных в собственном коде. Дополнительные сведения об оптимизированных для памяти табличных типах см. в разделе Переменные оптимизированной для памяти таблицы.

Разрешения

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

Примеры

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

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

CREATE TYPE SSN
FROM varchar(11) NOT NULL ;

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

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

Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

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

См. также

Справочник

CREATE ASSEMBLY (Transact-SQL)

DROP TYPE (Transact-SQL)

EVENTDATA (Transact-SQL)