CREATE TYPE (Transact-SQL)
Cria um tipo de dados de alias ou um tipo definido pelo usuário no banco de dados atual. A implementação de um tipo de dados de alias é baseada em um tipo de sistema nativo do SQL Server. Um tipo definido pelo usuário é implementado por uma classe de um assembly em CLR (Common Language Runtime) Microsoft.NET Framework. Para associar um tipo definido pelo usuário à sua implementação, o assembly CLR que contém a implementação do tipo deve primeiro ser registrado no SQL Server usando CREATE ASSEMBLY.
Observação |
---|
A capacidade de executar código CLR é desativada por padrão no SQL Server. Você pode criar, modificar e cancelar objetos do banco de dados que referenciam módulos de códigos gerenciados, mas essas referências não serão executadas no SQL Server a menos que clr enabled Option esteja habilitada usando sp_configure. |
Sintaxe
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 }
}
Argumentos
schema_name
É o nome do esquema ao qual o tipo de dados de alias ou tipo definido pelo usuário pertence.type_name
É o nome do tipo de dados de alias ou tipo definido pelo usuário. Os nomes de tipos precisam estar de acordo com as regras para identificadores.base_type
É o tipo de dados fornecido do SQL Server no qual o tipo de dados de alias se baseia. base_type é sysname, sem padrão, e pode ser um dos seguintes valores: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 também pode ser qualquer sinônimo de tipo de dados mapeado para um desses tipos de dados de sistema.
precision
Para decimal ou numeric, é um inteiro não negativo indicando o número total máximo de dígitos decimais que podem ser armazenados à esquerda e à direita do ponto decimal. Para obter mais informações, consulte decimal e numeric (Transact-SQL).scale
Para decimal ou numeric, é um inteiro não negativo indicando o número total máximo de dígitos decimais que podem ser armazenados à direita do ponto decimal e devem ser menores que ou igual à precisão. Para obter mais informações, consulte decimal e numeric (Transact-SQL).NULL | NOT NULL
Especifica se o tipo pode ter um valor nulo. Se não for especificado, NULL será o padrão.assembly_name
Especifica o assembly do SQL Server que referencia a implementação do tipo definido pelo usuário em Common Language Runtime. assembly_name deve corresponder a um assembly existente do SQL Server no banco de dados atual.[.class_name ]
Especifica a classe dentro do assembly que implementa o tipo definido pelo usuário. class_name deve ser um identificador válido e deve existir como uma classe no assembly com visibilidade do assembly. class_name diferencia maiúsculas e minúsculas, independentemente do agrupamento de banco de dados, e deve exatamente análogo ao nome da classe no assembly correspondente. O nome da classe pode ser um nome qualificado de namespace entre colchetes ([ ]) se a linguagem de programação usada para escrever a classe usar o conceito de namespaces, tal como C#. Se class_name não for especificado, o SQL Server assumirá que é igual ao type_name.<column_definition>
Define as colunas para um tipo de tabela definido pelo usuário. Para obter mais informações sobre colunas, consulte Adicionando e excluindo colunas.<data type>
Define o tipo de dados em uma coluna para um tipo de tabela definido pelo usuário. Para obter mais informações sobre tipos de dados, consulte Tipos de dados (Transact-SQL). Para obter mais informações sobre tabelas, consulte CREATE TABLE (Transact-SQL).<column_constraint>
Define as restrições de coluna para um tipo de tabela definido pelo usuário. As restrições com suporte incluem PRIMARY KEY, UNIQUE e CHECK. Para obter mais informações sobre restrições, consulte Impondo a integridade dos dados. Para obter mais informações sobre tabelas, consulte CREATE TABLE (Transact-SQL).<computed_column_definition>
Define uma expressão de coluna computada como uma coluna em um tipo de tabela definido pelo usuário. Para obter mais informações sobre colunas computadas, consulte Colunas computadas. Para obter mais informações sobre tabelas, consulte CREATE TABLE (Transact-SQL).<table_constraint>
Define uma restrição de tabela em um tipo de tabela definido pelo usuário. As restrições com suporte incluem PRIMARY KEY, UNIQUE e CHECK. Para obter mais informações sobre restrições de tabela, consulte Restrições.<index_option>
Especifica a resposta de erro para duplicar valores de chave em uma operação de inserção de várias linhas em um índice exclusivo clusterizado ou não. Para obter mais informações sobre opções de índice, consulte CREATE INDEX (Transact-SQL).
Comentários
Quando CREATE TYPE é usado para criar um tipo de dado CLR definido pelo usuário, a compatibilidade do banco de dados deve ser 90.
A classe do assembly que é referenciada em assembly_name, incluindo seus métodos, devem satisfazer todos os requisitos para a implementação de um tipo definido pelo usuário no SQL Server. Para obter mais informações sobre esses requisitos, consulte Tipos CLR definidos pelo usuário.
Considerações adicionais incluem o seguinte:
A classe pode ter métodos sobrecarregados, mas eles podem ser chamados somente de dentro do código gerenciado, e não do Transact-SQL.
Qualquer membro estático deve ser declarado como const ou readonly se assembly_name for SAFE ou EXTERNAL_ACCESS.
Dentro de um banco de dados, pode haver apenas um único tipo definido pelo usuário registrado em qualquer tipo especificado que seja carregado no SQL Server do CLR. Se um tipo definido pelo usuário for criado em um tipo CLR para o qual um tipo definido pelo usuário já exista no banco de dados, CREATE TYPE falhará com um erro. Essa restrição é necessária para evitar ambigüidade durante a resolução de Tipo SQL se um tipo CLR puder ser mapeado para mais de um tipo definido pelo usuário.
Se qualquer método modificador no tipo não retornar nulo, a instrução CREATE TYPE não será executada.
Para modificar um tipo definido pelo usuário, você deve descartar o tipo usando uma instrução DROP TYPE e, em seguida, recriá-lo.
Diferentemente dos tipos definidos pelo usuário que são criados usando sp_addtype, para a função de banco de dados public, não é automaticamente concedida a permissão REFERENCES em tipos que são criados usando CREATE TYPE. Essa permissão deve ser concedida separadamente.
Em tipos de tabela definidos pelo usuário, os tipos estruturados definidos pelo usuário que são usados em column_name <data type> fazem parte do escopo de esquema do banco de dados no qual o tipo de tabela é definido. Para acessar os tipos estruturados definidos pelo usuário em um escopo diferente dentro do banco de dados, use nomes de duas partes.
Em tipos de tabela definidos pelo usuário, a chave primária em colunas computadas deve ser PERSISTED e NOT NULL.
Permissões
Requer a permissão CREATE TYPE no banco de dados atual e a permissão ALTER em schema_name. Se schema_name não for especificado, serão aplicadas as regras de resolução de nome padrão ao determinar o esquema para o usuário atual. Se assembly_name for especificado, um usuário deve possuir o assembly ou ter a permissão REFERENCES para ele.
Exemplos
A. Criando um tipo de alias com base no tipo de dados varchar
O exemplo a seguir cria um tipo de alias com base no tipo de dados varchar fornecido pelo sistema.
CREATE TYPE SSN
FROM varchar(11) NOT NULL ;
B. Criando um tipo definidos pelo usuário
O exemplo a seguir cria um tipo Utf8String que referencia a classe utf8string no assembly utf8string. Antes de criar o tipo, o assembly utf8string é registrado no banco de dados local.
CREATE ASSEMBLY utf8string
FROM '\\ComputerName\utf8string\utf8string.dll' ;
GO
CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;
GO
C. Criando um tipo de tabela definido pelo usuário
O exemplo a seguir cria um tipo de tabela definido pelo usuário que tem duas colunas. Para obter mais informações sobre como criar e usar parâmetros com valor de tabela, consulte Parâmetros com valor de tabela (Mecanismo de Banco de Dados).
/* Create a user-defined table type */
CREATE TYPE LocationTableType AS TABLE
( LocationName VARCHAR(50)
, CostRate INT )
GO