CREATE TYPE (Transact-SQL)
Crea un tipo di dati alias o un tipo definito dall'utente (UDT) nel database corrente in SQL Server o Database SQL di Azure. L'implementazione di un tipo di dati alias è basata su un tipo di sistema nativo di SQL Server. I tipi definiti dall'utente vengono invece implementati tramite una classe di un assembly CLR (Common Language Runtime) di Microsoft .NET Framework. Per associare un tipo definito dall'utente alla relativa implementazione, è innanzitutto necessario registrare l'assembly CLR che contiene l'implementazione del tipo in SQL Server tramite CREATE ASSEMBLY.
Per impostazione predefinita, l'esecuzione di codice CLR è disattivata in SQL Server. È possibile creare, modificare ed eliminare oggetti di database che fanno riferimento a moduli di codice gestito, ma tali riferimenti non verranno eseguiti in SQL Server a meno che non si abiliti l'opzione clr enabled tramite sp_configure.
Si applica a: SQL Server (da SQL Server 2008 alla versione corrente), Database SQL di Azure (dalla versione iniziale alla versione corrente). |
Convenzioni della sintassi Transact-SQL
Sintassi
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}]
}
Argomenti
schema_name
Nome dello schema a cui appartiene il tipo di dati alias o il tipo definito dall'utente.type_name
Nome del tipo di dati alias o del tipo definito dall'utente. I nomi dei tipi devono essere conformi alle regole per gli identificatori.base_type
Tipo di dati di SQL Server su cui è basato il tipo di dati alias. base_type è di tipo sysname e non prevede alcun valore predefinito. I possibili valori sono i seguenti: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)
Per l'argomento base_type è inoltre possibile specificare qualsiasi sinonimo di tipo di dati che esegue il mapping a uno di questi tipi di dati di sistema.
precision
Per i tipi decimal o numeric, valore integer non negativo che indica il numero massimo totale di cifre decimali che è possibile archiviare, sia a sinistra che a destra del separatore decimale. Per ulteriori informazioni, vedere decimal e numeric (Transact-SQL).scale
Per i tipi decimal o numeric, valore integer non negativo che indica il numero massimo di cifre decimali che è possibile archiviare a destra del separatore decimale. Deve essere minore o uguale al valore della precisione. Per ulteriori informazioni, vedere decimal e numeric (Transact-SQL).NULL | NOT NULL
Specifica se il tipo supporta la memorizzazione di valori Null. Se omesso, l'impostazione predefinita è NULL.assembly_name
Si applica a: da SQL Server 2008 a SQL Server 2014.
Specifica l'assembly di SQL Server che fa riferimento all'implementazione del tipo definito dall'utente in CLR. assembly_name deve corrispondere a un assembly esistente in SQL Server nel database corrente.
Nota
EXTERNAL_NAME non è disponibile in un database indipendente.
[. class_name ]
Si applica a: da SQL Server 2008 a SQL Server 2014.
Specifica la classe nell'assembly che implementa il tipo definito dall'utente. class_name deve essere un identificatore valido e deve esistere come classe nell'assembly con visibilità dell'assembly. class_name supporta la distinzione tra maiuscole e minuscole, indipendentemente dalle regole di confronto del database e deve corrispondere esattamente al nome di classe nell'assembly corrispondente. Il nome di classe può essere un nome qualificato con lo spazio dei nomi e racchiuso tra parentesi quadre ([ ]) se il linguaggio di programmazione utilizzato per scrivere la classe utilizza il concetto degli spazi dei nomi, come C#. Se class_name viene omesso, SQL Server presume che equivalga a type_name.
<column_definition>
Definisce le colonne per un tipo di tabella definito dall'utente.<tipo di dati>
Definisce il tipo di dati in una colonna con un tipo di tabella definito dall'utente. Per ulteriori informazioni sui tipi di dati, vedere Tipi di dati (Transact-SQL). Per ulteriori informazioni sulle tabelle, vedere CREATE TABLE (SQL Server).<column_constraint>
Definisce i vincoli di colonna per un tipo di tabella definito dall'utente. I vincoli supportati includono PRIMARY KEY, UNIQUE e CHECK. Per ulteriori informazioni sulle tabelle, vedere CREATE TABLE (SQL Server).<computed_column_definition>
Definisce un'espressione di colonna calcolata come una colonna in un tipo di tabella definito dall'utente. Per ulteriori informazioni sulle tabelle, vedere CREATE TABLE (SQL Server).<table_constraint>
Definisce un vincolo di tabella per un tipo di tabella definito dall'utente. I vincoli supportati includono PRIMARY KEY, UNIQUE e CHECK.<index_option>
Specifica il tipo di risposta in caso di errori di valori di chiave duplicati in un'operazione di inserimento di più righe su un indice cluster o non cluster univoco. Per ulteriori informazioni sulle opzioni per gli indici, vedere CREATE INDEX (Transact-SQL).INDEX
È necessario specificare gli indici di tabella e di colonna come parte dell'istruzione CREATE TABLE. CREATE INDEX e DROP INDEX non sono supportati per le tabelle con ottimizzazione per la memoria.MEMORY_OPTIMIZED
Si applica a: da SQL Server 2014 a SQL Server 2014.
Indica se il tipo di tabella è con ottimizzazione per la memoria. Questa opzione è disabilitata per impostazione predefinita; il tipo di tabella o la tabella non è con ottimizzazione per la memoria. I tipi di tabella con ottimizzazione per la memoria sono tabelle utente con ottimizzazione per la memoria, il cui schema è persistente su disco in modo analogo ad altre tabelle utente. È possibile accedere ai tipi di tabella con ottimizzazione per la memoria solo da stored procedure compilate in modo nativo.
BUCKET_COUNT
Si applica a: da SQL Server 2014 a SQL Server 2014.
Indica il numero di bucket che deve essere creato nell'indice hash. Il valore massimo per BUCKET_COUNT in indici hash è 1.073.741.824. Per ulteriori informazioni sui numeri di bucket, vedere Determinazione del numero di bucket corretto per gli indici hash. bucket_count è un argomento obbligatorio.
HASH
Si applica a: da SQL Server 2014 a SQL Server 2014.
Indica che viene creato un indice HASH. Gli indici hash sono supportati solo nelle tabelle con ottimizzazione per la memoria.
Osservazioni
La classe dell'assembly specificata in assembly_name e i relativi metodi devono soddisfare tutti i requisiti per l'implementazione di un tipo definito dall'utente in SQL Server. Per ulteriori informazioni su tali requisiti, vedere Tipi CLR definiti dall'utente.
Ulteriori considerazioni:
La classe può contenere metodi di overload, ma tali metodi possono essere chiamati solo da codice gestito e non da Transact-SQL.
Qualsiasi membro statico deve essere dichiarato come const o readonly se assembly_name è impostato su SAFE o EXTERNAL_ACCESS.
Nell'ambito di un database può esistere un solo tipo definito dall'utente registrato per qualsiasi tipo specificato caricato in SQL Server da CLR. Se si crea un tipo definito dall'utente basato su un tipo CLR per cui esiste già un tipo definito dall'utente nel database, l'istruzione CREATE TYPE viene interrotta e viene generato un errore. Questa restrizione risulta necessaria per evitare ambiguità durante la risoluzione dei tipi SQL, nel caso su un tipo CLR possa essere eseguito il mapping a più di un tipo definito dall'utente.
Se qualsiasi metodo mutatore nel tipo non restituisce void, l'istruzione CREATE TYPE non viene eseguita.
Per modificare un tipo definito dall'utente, è necessario eliminare il tipo tramite l'istruzione DROP TYPE e quindi ricrearlo.
Diversamente dai tipi definiti dall'utente creati tramite sp_addtype, al ruolo del database public non viene concessa automaticamente l'autorizzazione REFERENCES per i tipi creati tramite CREATE TYPE. È necessario concedere l'autorizzazione separatamente.
Nei tipi di tabella definiti dall'utente, i tipi strutturati definiti dall'utente utilizzati in column_name< tipo di dati> sono parte dell'ambito dello schema del database in cui il tipo di tabella è definito. Per accedere ai tipi strutturati definiti dall'utente in un ambito diverso all'interno del database, utilizzare nomi in due parti.
Nei tipi di tabella definiti dall'utente, la chiave primaria sulle colonne calcolate deve essere PERSISTED e NOT NULL.
Tipi di tabella con ottimizzazione per la memoria
A partire da SQL Server 2014, l'elaborazione dei dati in un tipo di tabella può essere eseguita nella memoria primaria e non su disco. Per ulteriori informazioni, vedere OLTP in memoria (ottimizzazione per la memoria). Per esempi di codice relativi alla creazione di tipi di tabella con ottimizzazione per la memoria, vedere Creazione di una tabella con ottimizzazione per la memoria e di una stored procedure compilata in modo nativo. Per ulteriori informazioni sui tipi di tabelle con ottimizzazione per la memoria, vedere Variabili di tabella con ottimizzazione per la memoria.
Autorizzazioni
È richiesta l'autorizzazione CREATE TYPE nel database corrente e l'autorizzazione ALTER per schema_name. Se schema_name viene omesso, vengono applicate le regole predefinite per la risoluzione dei nomi per determinare lo schema dell'utente corrente. Se l'argomento assembly_name viene specificato, è necessario che l'utente sia il proprietario dell'assembly o disponga dell'autorizzazione REFERENCES per tale assembly.
Esempi
A.Creazione di un tipo alias basato sul tipo di dati varchar
Nell'esempio seguente viene creato un tipo alias basato sul tipo di dati di sistema varchar.
CREATE TYPE SSN
FROM varchar(11) NOT NULL ;
B.Creazione di un tipo definito dall'utente
Nell'esempio seguente viene creato un tipo Utf8String che fa riferimento alla classe utf8string nell'assembly utf8string. Prima di creare il tipo, l'assembly utf8string viene registrato nel database locale.
Si applica a: da SQL Server 2008 a SQL Server 2014. |
CREATE ASSEMBLY utf8string
FROM '\\ComputerName\utf8string\utf8string.dll' ;
GO
CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;
GO
C.Creazione di un tipo di tabella definito dall'utente
Nell'esempio seguente viene creato un tipo di tabella definito dall'utente con due colonne. Per ulteriori informazioni sulla creazione e l'utilizzo di parametri con valore di tabella, vedere Utilizzare parametri con valori di tabella (Motore di database).
/* Create a user-defined table type */
CREATE TYPE LocationTableType AS TABLE
( LocationName VARCHAR(50)
, CostRate INT );
GO