CREATE TYPE (Transact-SQL)

Gilt für:yesSQL Server (alle unterstützten Versionen) YesAzure SQL-Datenbank

Erstellt einen Aliasdatentyp oder einen benutzerdefinierten Typ in der aktuellen Datenbank in SQL Server oder Azure SQL-Datenbank. Die Implementierung eines Aliasdatentyps basiert auf einem nativen SQL Server-Systemtyp. 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 mit CREATE ASSEMBLY in SQL Server registriert werden.

Die Option zum Ausführen von CLR-Code ist in SQL Server standardmäßig 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.

Hinweis

Die Integration der .NET Framework-CLR in SQL Server wird in diesem Thema erläutert. Die CLR-Integration gilt nicht für Azure SQL-Datenbank.

Topic link iconTransact-SQL-Syntaxkonventionen

Syntax

-- User-defined Data 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> [ ,... n ] }
      [ <table_constraint> ] [ ,... n ]    
      [ <table_index> ] [ ,... 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 }  
}  

< table_index > ::=  
  INDEX constraint_name  
     [ CLUSTERED | NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )} }  
-- User-defined Memory Optimized Table Types syntax  
CREATE TYPE [schema_name. ] type_name  
AS TABLE ( { <column_definition> [ ,... n ] }  
    | [ <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 } ]  
}  

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.

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
Ist der von SQL Server bereitgestellte Datentyp, auf dem der Aliasdatentyp basiert. base_type ist vom Datentyp sysname und hat keinen Standardwert. Folgende Werte sind möglich:

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 außerdem jedes Synonym für Datentypen sein, das einem dieser Systemdatentypen zugeordnet wird.

precision
Für decimal oder numeric: Eine nicht negative ganze Zahl, die die maximale Anzahl von Dezimalstellen angibt, die vor und nach dem Dezimaltrennzeichen 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 von 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
Gilt für: SQL Server (ab SQL Server 2008).

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.

Hinweis

EXTERNAL_NAME ist in einer eigenständigen Datenbank nicht verfügbar.

[.class_name]
Gilt für: SQL Server (ab SQL Server 2008).

Gibt die Klasse innerhalb der Assembly an, die den benutzerdefinierten Typ implementiert. class_name muss ein gültiger Bezeichner sein und als Klasse mit Assemblysichtbarkeit in der Assembly vorhanden sein. Bei class_name muss unabhängig von der Datenbanksortierung die Groß-/Kleinschreibung beachtet werden, und der Wert 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#. Wenn class_name nicht angegeben ist, geht SQL Server davon aus, dass der Wert mit type_name identisch ist.

<column_definition>
Definiert die Spalten für einen benutzerdefinierten Tabellentyp.

<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 Tabellen finden Sie unter CREATE TABLE (Transact-SQL).

<computed_column_definition>
Definiert einen berechneten Spaltenausdruck in einem benutzerdefinierten Tabellentyp als Spalte. 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.

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

INDEX *index_name* [ CLUSTERED | NONCLUSTERED ] (*column_name* [ ASC | DESC ] [ ,... *n* ] )

Gilt für: SQL Server (ab SQL Server 2014 (12.x)), Azure SQL-Datenbank und Verwaltete Azure SQL-Instanz.

Gibt an, dass ein Index in der Tabelle erstellt werden soll. Dies kann ein gruppierter oder ein nicht gruppierter Index sein. Der Index enthält die aufgelisteten Spalten und sortiert die Daten in aufsteigender oder absteigender Reihenfolge.

INDEX
Sie müssen Spalten- und Tabellenindizes als Teil der CREATE TABLE-Anweisung angeben. CREATE INDEX und DROP INDEX werden für speicheroptimierte Tabellen nicht unterstützt.

MEMORY_OPTIMIZED
Gilt für: SQL Server (ab SQL Server 2014 (12.x)), Azure SQL-Datenbank und Verwaltete Azure SQL-Instanz. Verwaltete Azure SQL-Instanz unterstützt keine speicheroptimierte Tabellen in der Ebene „Universell“.

Gibt an, ob der Tabellentyp speicheroptimiert ist. Diese Option ist standardmäßig deaktiviert; die Tabelle (der Tabellentyp) ist keine speicheroptimierte Tabelle (kein speicheroptimierter Tabellentyp). Speicheroptimierte Tabellentypen sind speicheroptimierte Benutzertabellen, deren Schema auf dem Datenträger ähnlich anderen Benutzertabellen beibehalten wird.

BUCKET_COUNT
Gilt für : SQL Server (ab SQL Server 2014 (12.x)), Azure SQL-Datenbank und Azure SQL Managed Instance.

Gibt die Anzahl der Buckets an, die im Hashindex erstellt werden sollen. Der maximale Wert für BUCKET_COUNT in Hashindizes beträgt 1.073.741.824. Weitere Informationen zu Indizes für speicheroptimierte Tabellen finden Sie unter Indexes for Memory-Optimized Tables (Indizes für speicheroptimierte Tabellen). bucket_count ist ein erforderliches Argument.

HASH
Gilt für : SQL Server (ab SQL Server 2014 (12.x)), Azure SQL-Datenbank und Azure SQL Managed Instance.

Gibt an, dass ein HASH-Index erstellt wird. Hashindizes werden nur für speicheroptimierte Tabellen unterstützt.

Bemerkungen

Die Klasse der Assembly, auf die in assembly_name verwiesen wird, und ihre Methoden sollten alle Anforderungen für die Implementierung eines benutzerdefinierten Typs in SQL Server erfüllen. Weitere Informationen zu diesen Anforderungen finden Sie unter CLR User-Defined Types (Benutzerdefinierte CLR-Typen).

Noch einige zusätzliche Überlegungen:

  • Die Klasse kann überladene Methoden enthalten, diese Methoden können jedoch nur in verwaltetem Code aufgerufen werden, 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 von der CLR in SQL Server 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.

Bei benutzerdefinierten Tabellentypen gehören strukturierte benutzerdefinierte Typen, die in column_name<data type> verwendet werden, zum Bereich des Datenbankschemas, 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.

Speicheroptimierte Tabellentypen

Ab SQL Server 2014 (12.x) kann die Verarbeitung von Daten in einem Tabellentyp im Primärspeicher und nicht auf einem Datenträger erfolgen. Weitere Informationen finden Sie unter In-Memory OLTP (Speicheroptimierung). Codebeispiele, die das Erstellen speicheroptimierter Tabellentypen veranschaulichen, finden Sie unter Erstellen einer speicheroptimierten Tabelle und einer systemintern kompilierten gespeicherten Prozedur.

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.

Wenn in der CREATE TABLE-Anweisung eine Spalte als Spalte eines benutzerdefinierten Typs definiert wird, ist die REFERENCES-Berechtigung für den benutzerdefinierten Typ erforderlich.

Hinweis

Eine Benutzer, der eine Tabelle mit einer Spalte erstellt, die einen benutzerdefinierten Typ verwendet, benötigt die REFERENCES-Berechtigung für den benutzerdefinierten Typ. Wenn diese Tabelle in TempDB erstellt werden muss, muss entweder vor jedem Erstellen der Tabelle die REFERENCES-Berechtigung explizit erteilt werden, oder der betreffende Datentyp und die REFERENCES-Berechtigungen müssen der Modelldatenbank hinzugefügt werden. Wenn dies erfolgt ist, stehen der betreffende Datentyp und die Berechtigungen dauerhaft in TempDB zur Verfügung. Andernfalls verschwinden der benutzerdefinierte Datentyp und die Berechtigungen bei einem Neustart von SQL Server. Weitere Informationen finden Sie unter CREATE TABLE

Beispiele

A. Erstellen eines Aliastyps anhand 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. Ersetzen Sie den binären Teil der CREATE ASSEMBLY-Anweisung durch eine gültige Beschreibung.

Gilt für: SQL Server (ab SQL Server 2008).

CREATE ASSEMBLY utf8string  
AUTHORIZATION [dbi]   
FROM 0x4D... ;  
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 Verwenden von Tabellenwertparametern (Datenbank-Engine).

CREATE TYPE LocationTableType AS TABLE   
    ( LocationName VARCHAR(50)  
    , CostRate INT );  
GO  

D: Erstellen eines benutzerdefinierten Tabellentyp mit Primärschlüssel und Index

Im folgenden Beispiel wird ein benutzerdefinierter Tabellentyp mit drei Spalten erstellt, von denen eine (Name) der Primärschlüssel und eine andere (Price) ein nicht gruppierter Index ist. Weitere Informationen zum Erstellen und Verwenden von Tabellenwertparametern finden Sie unter Verwenden von Tabellenwertparametern (Datenbank-Engine).

CREATE TYPE InventoryItem AS TABLE
(
	[Name] NVARCHAR(50) NOT NULL,
	SupplierId BIGINT NOT NULL,
	Price DECIMAL (18, 4) NULL,
	PRIMARY KEY (
		Name
	),
	INDEX IX_InventoryItem_Price (
		Price
	)
)
GO

Weitere Informationen

CREATE ASSEMBLY (Transact-SQL)
DROP TYPE (Transact-SQL)
EVENTDATA (Transact-SQL)
Benutzerdefinierte CLR-Typen
Arbeiten mit benutzerdefinierten Typen in SQL Server