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.

Icona di collegamento a un argomentoConvenzioni 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

Nuovo contenuto:
  • Nella sezione Osservazioni, aggiunta dell'indicazione che in caso di utilizzo di CREATE TYPE per la creazione di un tipo CLR definito dall'utente la compatibilità del database deve essere pari a 90.
  • Nella sezione Argomenti, aggiunta per [.class_name ] dell'indicazione che in caso di omissione di class_name SQL Server presume che equivalga a type_name.

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

Guida in linea e informazioni

Assistenza su SQL Server 2005