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 является неотрицательным целым числом, которое указывает на максимальное общее число подлежащих сохранению десятичных знаков как слева, так и справа от десятичного разделителя, отделяющего десятичную дробь от целого числа. Дополнительные сведения см. в разделе decimal и numeric (Transact-SQL).scale
Для типа decimal или numeric является неотрицательным целым числом, которое указывает на максимальное общее число подлежащих сохранению десятичных знаков справа от разделителя, отделяющего десятичную дробь от целого числа. Значение должно быть меньше или равно заданной степени точности. Дополнительные сведения см. в разделе decimal и numeric (Transact-SQL).NULL | NOT NULL
Указывает, может ли данный тип иметь значение NULL. Если не указано иное, по умолчанию принимается значение NULL.assembly_name
Указывает на сборку SQL Server, которая ссылается на реализацию определяемого пользователем типа в среде CLR. Аргумент assembly_name должен соответствовать существующей сборке в SQL Server в текущей базе данных.Примечание Параметр EXTERNAL_NAME недоступен в автономной базе данных.
[. 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 для работы с ней.
Примеры
А.Создание псевдонима на базе типа данных 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