CREATE TYPE (Transact-SQL)

Crea un tipo di dati alias o un tipo definito dall'utente nel database corrente. 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.

[!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 tramite sp_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 ] 
  | 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 } 
}

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 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.

  • <column_definition>
    Definisce le colonne per un tipo di tabella definito dall'utente. Per ulteriori informazioni sulle colonne, vedere Aggiunta ed eliminazione di colonne.

  • <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 (Transact-SQL).

  • <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 sui vincoli, vedere Applicazione dell'integrità dei dati. Per ulteriori informazioni sulle tabelle, vedere CREATE TABLE (Transact-SQL).

  • <computed_column_definition>
    Definisce un'espressione di colonna calcolata come una colonna in un tipo di tabella definito dall'utente. Per ulteriori informazioni sulle colonne calcolate, vedere Colonne calcolate. Per ulteriori informazioni sulle tabelle, vedere CREATE TABLE (Transact-SQL).

  • <table_constraint>
    Definisce un vincolo di tabella per un tipo di tabella definito dall'utente. I vincoli supportati includono PRIMARY KEY, UNIQUE e CHECK. Per ulteriori informazioni sui vincoli di tabella, vedere Vincoli.

  • <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).

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 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 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.

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.

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.

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 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