CREATE TYPE (Transact-SQL)

 

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)jaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data Warehouse

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 systemeigenen Typ von SQL Server. Ein benutzerdefinierten Typ wird durch eine Klasse einer Assembly im implementiert die Microsoft .NET Framework common Language Runtime (CLR). Um einen benutzerdefinierten Typ an seine Implementierung zu binden, muss die CLR-Assembly, die die Implementierung des Typs enthält zunächst in registriert werden SQL Server mit CREATE ASSEMBLY.

Die Option zum Ausführen von CLR-Code ist standardmäßig in SQL Server deaktiviert. Erstellen, ändern und Löschen von Datenbankobjekten, die auf verwaltete Codemodule verweisen, aber diese Verweise werden nicht ausgeführt, SQL Server , sofern die Option Clr enabled aktiviert ist, mithilfe von Sp_configure.

System_CAPS_ICON_note.jpg Hinweis


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

Topic link icon Transact-SQL-Syntaxkonventionen

  
      Disk-Based 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> }  
        [ <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 }  
}  

  
      Memory-Optimized Table Type Syntax  
CREATE TYPE [schema_name. ] type_name  
AS TABLE ( { <column_definition> }  
    |  [ <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}]  
}  

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

base_type
Ist die SQL Server bereitgestellte Datentyp, auf denen der Aliasdatentyp basiert. Base_type ist Sysname, hat keinen Standardwert und kann die folgenden Werte sind möglich:

bigintbinary( n )Bitchar( n )
Datum"DateTime"datetime2"DateTimeOffset"
Dezimalzahl"float"imageint
Moneynchar( n )ntextnumerische
nvarchar( nmax)echtesmalldatetime"smallint"
smallmoneysql_varianttextZeit
"tinyint""uniqueidentifier"varbinary( nmax)varchar( nmax)

Base_type kann außerdem jedes Synonym für Datentypen, das einem dieser Systemdatentypen zugeordnet, sein.

Genauigkeit
Für decimal oder numerischen, ist eine nicht Negative ganze Zahl, die die maximale Gesamtanzahl von Dezimalstellen angibt, nach links und rechts vom Dezimaltrennzeichen gespeichert werden können. Weitere Informationen finden Sie unter Decimal und Numeric (Transact-SQL).

Skalierung
Für decimal oder numerischen, ist eine nicht Negative ganze Zahl, der die maximale Anzahl von Dezimalstellen angibt, die rechts neben dem Dezimalzeichen gespeichert werden können, und er muss kleiner oder gleich der Genauigkeit 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.

AssemblyName

Gilt für: SQL Server 2008 bis SQL Server 2016.

Gibt an, die SQL Server Assembly, die die Implementierung des benutzerdefinierten Typs in der common Language Runtime verweist. Assembly_name übereinstimmen, eine vorhandene Assembly in SQL Server in der aktuellen Datenbank.

System_CAPS_ICON_note.jpg Hinweis


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

[. CLASS_NAME**] **

Gilt für: SQL Server 2008 bis SQL Server 2016.

Gibt die Klasse innerhalb der Assembly an, die den benutzerdefinierten Typ implementiert. CLASS_NAME muss ein gültiger Bezeichner sein und als Klasse in der Assembly mit Assemblysichtbarkeit vorhanden sein. CLASS_NAME wird Groß-/Kleinschreibung beachtet, unabhängig von der datenbanksortierung, und muss genau dem Klassennamen in der entsprechenden Assembly entsprechen. Der Klassenname einen Namespace qualifizierten Namen in eckige Klammern eingeschlossen sein kann ([]) Wenn die Programmiersprache ab, die zum Schreiben der Klasse verwendet wird, das Konzept von Namespaces, z. B. c# verwendet. Wenn Class_name nicht angegeben ist, SQL Server wird angenommen, sie entspricht dem Type_name.

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

>
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
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 2014 über SQL Server 2016 und Azure SQL-Datenbank.

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 2014 über SQL Server 2016 und Azure SQL-Datenbank.

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 bucketanzahlen finden Sie unter Indizes für Speicheroptimierte Tabellen. Bucket_count ist ein erforderliches Argument.

HASH

Gilt für: SQL Server 2014 über SQL Server 2016 und Azure SQL-Datenbank.

Gibt an, dass ein HASH-Index erstellt wird. Hash-Indizes werden nur für Speicheroptimierte Tabellen unterstützt.

Die Klasse der Assembly, auf das verweist Assembly_name, und ihre Methoden sollten alle Anforderungen zum Implementieren eines benutzerdefinierten Typs in erfüllen SQL Server. 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.

  • Irgendwelche statischen Member müssen deklariert werden, als const oder Readonly Wenn Assembly_name SAFE oder EXTERNAL_ACCESS festgelegt ist.

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.

Wenn eine Mutatormethode im Typ nicht zurückgibt "void", die CREATE TYPE-Anweisung wird 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 erstellt werden Sp_addtype, öffentlichen Datenbankrolle wird nicht automatisch gewährt, REFERENCES-Berechtigung für Typen, die mithilfe von CREATE TYPE erstellt werden. Diese Berechtigung muss separat erteilt werden.

In benutzerdefinierten Tabellentypen strukturierte benutzerdefinierte Typen, die in verwendet werden Column_name  > sind Teil des Datenbankbereichs-Schema in dem der Tabellentyp definiert wird. 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.

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

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. Wenn Assembly_name angegeben wird, ein Benutzer muss Besitzer der Assembly oder darauf REFERENCES-Berechtigung haben.

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

Das folgende Beispiel erstellt einen Typ Utf8String , die auf Klasse verweist utf8string in der Assembly utf8string. 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 2008 bis SQL Server 2016.
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 Tabellenwertparametern (Datenbankmodul).

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

Erstellen Sie die ASSEMBLY (Transact-SQL)
DROP-Typ (Transact-SQL)
EVENTDATA (Transact-SQL)

Community-Beiträge

HINZUFÜGEN
Anzeigen: