CREATE TYPE (Transact-SQL)

Erstellt einen Aliasdatentyp oder einen benutzerdefinierten CLR-Typ in der aktuellen Datenbank.Die Implementierung eines Aliasdatentyps basiert auf einem systemeigenen Typ von SQL Server. Ein benutzerdefinierter Typ wird durch eine Klasse einer Assembly in der Common Language Runtime (CLR) von Microsoft .NET Framework implementiert. Um einen benutzerdefinierten Typ an seine Implementierung zu binden, muss die CLR-Assembly, die die Implementierung des Typs enthält, zuerst in SQL Server mit CREATE ASSEMBLY registriert werden.

HinweisHinweis

Die Option zum Ausführen von CLR-Code ist standardmäßig in SQL Server deaktiviert. Sie können Datenbankobjekte, die auf verwaltete Codemodule verweisen, erstellen, ändern und löschen. Diese Verweise werden jedoch nur dann in SQL Server ausgeführt, wenn die Option clr enabled mithilfe von sp_configure aktiviert wird.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

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

Argumente

  • schema_name
    Der Name des Schemas, dem der Aliasdatentyp oder benutzerdefinierte Typ angehört.

  • type_name
    Der Name des Aliasdatentyps oder benutzerdefinierten Datentyps. Typnamen müssen den Regeln für Bezeichner entsprechen.

  • base_type
    Der von SQL Server bereitgestellte Datentyp, auf dem der Aliasdatentyp basiert. base_type ist vom Datentyp sysname, hat keinen Standardwert und kann einen der folgenden Werte annehmen:

    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 kann auch jedes beliebige Datentypsynonym sein, das einem dieser Systemdatentypen zugeordnet werden kann.

  • precision
    Für decimal oder numeric: Eine nicht negative ganze Zahl, die die maximale Anzahl Dezimalstellen angibt, die vor und nach dem Dezimalzeichen gespeichert werden können.Weitere Informationen finden Sie unter decimal und numeric (Transact-SQL).

  • scale
    Für decimal oder numeric: Eine nicht negative ganze Zahl, die die maximale Anzahl Dezimalstellen angibt, die nach dem Dezimalzeichen gespeichert werden können. Diese Zahl muss kleiner oder gleich der Gesamtzahl der Stellen sein.Weitere Informationen finden Sie unter decimal und numeric (Transact-SQL).

  • NULL | NOT NULL
    Gibt an, ob für den Typ NULL-Werte zulässig sind. Wird keine Angabe gemacht, ist NULL der Standardwert.

  • assembly_name
    Gibt die SQL Server-Assembly an, die auf die Implementierung des benutzerdefinierten Typs in der Common Language Runtime (CLR) verweist. assembly_name sollte einer vorhandenen Assembly in SQL Server in der aktuellen Datenbank entsprechen.

  • [.class_name ]
    Gibt die Klasse innerhalb der Assembly an, die den benutzerdefinierten Typ implementiert. class_name muss ein gültiger Bezeichner sein und muss als Klasse in der Assembly vorhanden und innerhalb der Assembly sichtbar sein. Für den Bezeichner class_name muss, unabhängig von der Datenbanksortierung, die Groß-/Kleinschreibung beachtet werden, und er muss genau dem Klassennamen in der entsprechenden Assembly entsprechen. Der Klassenname kann ein mit einem Namespace qualifizierter Name sein, der in eckigen Klammern (
    [ ]
    ) steht, wenn die Programmiersprache, die zum Schreiben der Klasse verwendet wird, das Konzept von Namespaces verwendet, wie z. B. C#.Wird class_name nicht angegeben, wird in SQL Server davon ausgegangen, dass es mit type_name identisch ist.

  • <column_definition>
    Definiert die Spalten für einen benutzerdefinierten Tabellentyp. Weitere Informationen über Spalten finden Sie unter Hinzufügen und Löschen von Spalten.

  • <Datentyp>
    Definiert die Datentypen in einer Spalten für einen benutzerdefinierten Tabellentyp. Weitere Informationen zu Datentypen finden Sie unter Datentypen (Transact-SQL). Weitere Informationen zu Tabellen finden Sie unter CREATE TABLE (Transact-SQL).

  • <column_constraint>
    Definiert die Spalteneinschränkungen für einen benutzerdefinierten Tabellentyp. Unterstützte Einschränkungen schließen PRIMARY KEY, UNIQUE und CHECK ein. Weitere Informationen zu Einschränkungen finden Sie unter Erzwingen der Datenintegrität. Weitere Informationen zu Tabellen finden Sie unter CREATE TABLE (Transact-SQL).

  • <computed_column_definition>
    Definiert einen berechneten Spaltenausdruck in einem benutzerdefinierten Tabellentyp als Spalte. Weitere Informationen zu berechneten Spalten finden Sie unter Berechnete Spalten. Weitere Informationen zu Tabellen finden Sie unter CREATE TABLE (Transact-SQL).

  • <table_constraint>
    Definiert eine Spalteneinschränkung für einen benutzerdefinierten Tabellentyp. Unterstützte Einschränkungen schließen PRIMARY KEY, UNIQUE und CHECK ein. Weitere Informationen zu Tabelleneinschränkungen finden Sie unter Einschränkungen.

  • <index_option>
    Gibt die Fehlerantwort auf doppelte Schlüsselwerte beim Einfügen mehrerer Zeilen für einen eindeutigen gruppierten oder einen eindeutigen nicht gruppierten Index an. Weitere Informationen zu Indexoptionen finden Sie unter CREATE INDEX (Transact-SQL).

Hinweise

Wird mit CREATE TYPE ein CLR-benutzerdefinierter Typ erstellt, muss die Datenbankkompatibilität den Wert 90 haben.

Die Klasse der Assembly, auf die in assembly_name verwiesen wird, und ihre Methoden sollten alle Anforderungen zum Implementieren eines benutzerdefinierten Typs in SQL Server erfüllen. Weitere Informationen zu diesen Anforderungen finden Sie unter Benutzerdefinierte CLR-Typen.

Noch einige zusätzliche Überlegungen:

  • Die Klasse kann überlastete Methoden umfassen, aber diese Methoden können nur innerhalb von verwaltetem Code aufgerufen werden und nicht aus Transact-SQL.

  • Alle statischen Elemente müssen als const oder readonly deklariert werden, wenn für assembly_name entweder SAFE oder EXTERNAL_ACCESS festgelegt wurde.

Innerhalb einer Datenbank kann nur ein benutzerdefinierter Typ für einen angegebenen Typ registriert werden, der in SQL Server von der CLR hochgeladen wurde. Wenn ein benutzerdefinierter Typ für einen CLR-Typ erstellt wurde, für den in der Datenbank bereits ein benutzerdefinierter Typ vorhanden ist, schlägt CREATE TYPE fehl und gibt einen Fehler aus. Diese Einschränkung ist erforderlich, um eine Mehrdeutigkeit bei der Zuordnung des SQL-Typs zu vermeiden, wenn ein CLR-Typ mehr als einem benutzerdefinierten Typ zugeordnet werden kann.

Gibt eine Mutatormethode im Typ nicht void zurück, wird die CREATE TYPE-Anweisung nicht ausgeführt.

Zum Ändern eines benutzerdefinierten Typs müssen Sie den Typ mit einer DROP TYPE-Anweisung löschen und ihn dann erneut erstellen.

Im Gegensatz zu benutzerdefinierten Typen, die mit sp_addtype erstellt wurden, wird der Datenbankrolle public nicht automatisch die REFERENCES-Berechtigung für Typen erteilt, die mit CREATE TYPE erstellt wurden.Diese Berechtigung muss separat erteilt werden.

In benutzerdefinierten Tabellentypen sind strukturierte benutzerdefinierte Typen, die in column_name <Datentyp> verwendet werden, Teil des Datenbankschemabereichs, in dem der Tabellentyp definiert ist. Um auf strukturierte benutzerdefinierte Typen in einem anderen Bereich innerhalb der Datenbank zuzugreifen, verwenden Sie zweiteilige Namen.

In benutzerdefinierten Tabellentypen muss der Primärschlüssel für berechnete Spalten PERSISTED und NOT NULL sein.

Berechtigungen

Erfordert die CREATE TYPE-Berechtigung für die aktuelle Datenbank und die ALTER-Berechtigung für schema_name. Wenn schema_name nicht angegeben wird, gelten die Standardregeln für die Namensauflösung, um das Schema für den aktuellen Benutzer zu bestimmen. Wird assembly_name angegeben, muss ein Benutzer entweder Besitzer der Assembly sein oder die REFERENCES-Berechtigung für die Assembly besitzen.

Beispiele

A. Erstellen eines Aliastyps auf der Basis des varchar-Datentyps

Im folgenden Beispiel wird ein Aliastyp erstellt, der auf dem vom System bereitgestellten Datentyp varchar basiert.

CREATE TYPE SSN
FROM varchar(11) NOT NULL ;

B. Erstellen eines benutzerdefinierten Typs

Im folgenden Beispiel wird der Typ Utf8String erstellt, der auf die Klasse utf8string in der Assembly utf8string verweist. Vor dem Erstellen des Typs wird die Assembly utf8string in der lokalen Datenbank registriert.

CREATE ASSEMBLY utf8string
FROM '\\ComputerName\utf8string\utf8string.dll' ;
GO
CREATE TYPE Utf8String 
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;
GO

C. Erstellen eines benutzerdefinierten Tabellentyps

Das folgende Beispiel zeigt, wie ein benutzerdefinierter Tabellentyp mit zwei Spalten erstellt wird: Weitere Informationen zum Erstellen und Verwenden von Tabellenwertparametern finden Sie unter Tabellenwertparameter (Datenbankmodul).

/* Create a user-defined table type */
CREATE TYPE LocationTableType AS TABLE 
    ( LocationName VARCHAR(50)
    , CostRate INT )
GO