CREATE TYPE (Transact-SQL)
Data aggiornamento: 14 aprile 2006
Crea un tipo di dati alias o un tipo definito dall'utente in un'istanza di SQL Server 2005. 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. Affinché SQL Server 2005 possa 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.
[!NOTA] 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 attivi l'opzione clr enabled tramitesp_configure.
Convenzioni della sintassi Transact-SQL
Sintassi
CREATE TYPE [ schema_name. ] type_name
{
FROM base_type
[ ( precision [ , scale ] ) ]
[ NULL | NOT NULL ]
| EXTERNAL NAME assembly_name [ .class_name ]
} [ ; ]
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)
datetime
decimal
float
image
int
money
nchar(n)
ntext
numeric
nvarchar(n | max)
real
smalldatetime
smallint
smallmoney
sql_variant
text
tinyint
uniqueidentifier
varbinary(n | max)
varchar(n | max)
Per l'argomento base_type è inoltre possibile specificare qualsiasi sinonimo di tipo di dati mappato 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
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.
- **[.**class_name ]
Specifica la classe nell'assembly che implementa il tipo definito dall'utente. class_name deve essere un identificatore valido di una classe esistente nell'assembly con visibilità a livello dell'assembly. Per l'argomento class_name non viene applicata alcuna distinzione tra maiuscole e minuscole, indipendentemente dalle regole di confronto del database, e il nome deve essere esattamente uguale 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.
Osservazioni
Quando si utilizza CREATE TYPE per creare un tipo CLR definito dall'utente, la compatibilità del database deve essere pari a 90.
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 CLR User-Defined Types.
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 un tipo CLR possa essere mappato 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.
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.
Cronologia delle modifiche
Versione | Cronologia |
---|---|
14 aprile 2006 |
|
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.
CREATE ASSEMBLY utf8string
FROM '\\ComputerName\utf8string\utf8string.dll' ;
GO
CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;
GO
Vedere anche
Riferimento
CREATE ASSEMBLY (Transact-SQL)
DROP TYPE (Transact-SQL)
EVENTDATA (Transact-SQL)
Altre risorse
Utilizzo dei tipi di dati alias
Utilizzo di tipi CLR definiti dall'utente