Freigeben über


CREATE TABLE (Transact-SQL)

Erstellt eine neue Tabelle in SQL Server 2012.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

CREATE TABLE 
    [ database_name . [ schema_name ] . | schema_name . ] table_name 
    [ AS FileTable ]
    ( { <column_definition> | <computed_column_definition> 
        | <column_set_definition> | [ <table_constraint> ] [ ,...n ] } )
    [ ON { partition_scheme_name ( partition_column_name ) | filegroup 
        | "default" } ] 
    [ { TEXTIMAGE_ON { filegroup | "default" } ] 
    [ FILESTREAM_ON { partition_scheme_name | filegroup 
        | "default" } ]
    [ WITH ( <table_option> [ ,...n ] ) ]
[ ; ]

<column_definition> ::= 
column_name <data_type>
    [ FILESTREAM ]
    [ COLLATE collation_name ] 
    [ SPARSE ]
    [ NULL | NOT NULL ]
    [ 
        [ CONSTRAINT constraint_name ] DEFAULT constant_expression ] 
      | [ IDENTITY [ ( seed ,increment ) ] [ NOT FOR REPLICATION ] 
    ]
    [ ROWGUIDCOL ] 
    [ <column_constraint> [ ...n ] ] 

<data type> ::= 
[ type_schema_name . ] type_name 
    [ ( precision [ , scale ] | max | 
        [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ] 

<column_constraint> ::= 
[ CONSTRAINT constraint_name ] 
{     { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
        [ 
            WITH FILLFACTOR = fillfactor  
          | WITH ( < index_option > [ , ...n ] ) 
        ] 
        [ ON { partition_scheme_name ( partition_column_name ) 
            | filegroup | "default" } ]

  | [ FOREIGN KEY ] 
        REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ] 
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ NOT FOR REPLICATION ] 

  | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
} 

<computed_column_definition> ::= 
column_name AS computed_column_expression 
[ PERSISTED [ NOT NULL ] ]
[ 
    [ CONSTRAINT constraint_name ]
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [ 
            WITH FILLFACTOR = fillfactor 
          | WITH ( <index_option> [ , ...n ] )
        ]
        [ ON { partition_scheme_name ( partition_column_name ) 
        | filegroup | "default" } ]

    | [ FOREIGN KEY ] 
        REFERENCES referenced_table_name [ ( ref_column ) ] 
        [ ON DELETE { NO ACTION | CASCADE } ] 
        [ ON UPDATE { NO ACTION } ] 
        [ NOT FOR REPLICATION ] 

    | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
] 

<column_set_definition> ::= 
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

< table_constraint > ::=
[ CONSTRAINT constraint_name ] 
{ 
    { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
        (column [ ASC | DESC ] [ ,...n ] ) 
        [ 
            WITH FILLFACTOR = fillfactor 
           |WITH ( <index_option> [ , ...n ] ) 
        ]
        [ ON { partition_scheme_name (partition_column_name)
            | filegroup | "default" } ] 
    | FOREIGN KEY 
        ( column [ ,...n ] ) 
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] 
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ NOT FOR REPLICATION ] 
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
} 
<table_option> ::=
{
    [DATA_COMPRESSION = { NONE | ROW | PAGE }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
      [ , ...n ] ) ]]
    [ FILETABLE_DIRECTORY = <directory_name> ] 
    [ FILETABLE_COLLATE_FILENAME = { <collation_name> | database_default } ]
    [ FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
}

<index_option> ::=
{ 
    PAD_INDEX = { ON | OFF } 
  | FILLFACTOR = fillfactor 
  | IGNORE_DUP_KEY = { ON | OFF } 
  | STATISTICS_NORECOMPUTE = { ON | OFF } 
  | ALLOW_ROW_LOCKS = { ON | OFF} 
  | ALLOW_PAGE_LOCKS ={ ON | OFF} 
  | DATA_COMPRESSION = { NONE | ROW | PAGE }
       [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
       [ , ...n ] ) ]
}
<range> ::= 
<partition_number_expression> TO <partition_number_expression>

Argumente

  • database_name
    Der Name der Datenbank, in der die Tabelle erstellt wird. database_name muss den Namen einer vorhandenen Datenbank angeben. Wird database_name nicht angegeben, wird standardmäßig die aktuelle Datenbank verwendet. Der Anmeldename für die aktuelle Verbindung muss einer vorhandenen Benutzer-ID in der durch database_name angegebenen Datenbank zugeordnet sein; diese Benutzer-ID muss über CREATE TABLE-Berechtigungen verfügen.

  • schema_name
    Der Name des Schemas, zu dem die neue Tabelle gehört.

  • table_name
    Der Name der neuen Tabelle. Tabellennamen müssen den Regeln für Bezeichner entsprechen. table_name kann höchstens 128 Zeichen aufweisen, ausgenommen lokale temporäre Tabellennamen (Namen mit einem einzelnen Nummernzeichen (#) als Präfix), bei denen maximal 116 Zeichen zulässig sind.

  • AS FileTable
    Erstellt die neue Tabelle als FileTable. Sie geben keine Spalten an, da eine FileTable über ein festes Schema verfügt. Weitere Informationen über FileTables finden Sie unter FileTables (SQL Server).

  • column_name
    Der Name einer Spalte in der Tabelle. Spaltennamen müssen den Regeln für Bezeichner entsprechen und in der Tabelle eindeutig sein. column_name kann bis zu 128 Zeichen aufweisen. column_name kann für mit einem timestamp-Datentyp erstellte Spalten entfallen. Wenn column_name nicht angegeben wird, wird für eine timestamp-Spalte standardmäßig der Name timestamp verwendet.

  • computed_column_expression
    Ein Ausdruck, der den Wert einer berechneten Spalte definiert. Eine berechnete Spalte ist eine virtuelle Spalte, die nicht physisch in der Tabelle gespeichert ist, es sei denn, die Spalte wurde (mit PERSISTED) als persistente Spalte markiert. Die Spalte wird anhand eines Ausdrucks berechnet, der andere Spalten in derselben Tabelle verwendet. Eine berechnete Spalte kann z. B. folgende Definition haben: cost AS price * qty. Der Ausdruck kann der Name einer nicht berechneten Spalte, eine Konstante, eine Funktion, eine Variable oder eine beliebige durch einen oder mehrere Operatoren verbundene Kombination der genannten Möglichkeiten sein. Der Ausdruck darf keine Unterabfrage sein oder Aliasdatentypen enthalten.

    Berechnete Spalten können in SELECT-Listen, WHERE-Klauseln, ORDER BY-Klauseln oder an anderen Stellen verwendet werden, an denen reguläre Ausdrücke verwendet werden können. Dabei gelten folgende Ausnahmen:

    • Berechnete Spalten müssen als PERSISTED gekennzeichnet sein, um Teil einer FOREIGN KEY- oder CHECK-Einschränkung zu sein.

    • Eine berechnete Spalte kann als Schlüsselspalte in einem Index oder als Teil einer PRIMARY KEY- oder UNIQUE-Einschränkung verwendet werden, wenn der Wert der berechneten Spalte durch einen deterministischen Ausdruck definiert ist und der Datentyp des Ergebnisses in Indexspalten zulässig ist.

      Wenn eine Tabelle beispielsweise die beiden ganzzahligen Spalten a und b enthält, kann für die berechnete Spalte a+b ein Index erstellt werden. Für die berechnete Spalte a+DATEPART(dd, GETDATE()) ist dies jedoch nicht möglich, da sich der Wert in späteren Aufrufen möglicherweise ändert.

    • Eine berechnete Spalte kann nicht das Ziel einer INSERT- oder UPDATE-Anweisung sein.

    HinweisHinweis

    Jede Zeile in einer Tabelle kann unterschiedliche Werte in den Spalten aufweisen, die für eine berechnete Spalte herangezogen werden, daher enthält die berechnete Spalte möglicherweise nicht in jeder Zeile den gleichen Wert.

    Die NULL-Zulässigkeit berechneter Spalten wird automatisch von Database Engine (Datenbankmodul) auf Grundlage der verwendeten Ausdrücke bestimmt. Für das Ergebnis der meisten Ausdrücke wird die NULL-Zulässigkeit angenommen, und zwar auch dann, wenn nur Spalten vorhanden sind, die keine NULL-Werte zulassen, da mögliche Unter- oder Überläufe ebenfalls zu NULL-Ergebnissen führen. Verwenden Sie die COLUMNPROPERTY-Funktion mit der AllowsNull-Eigenschaft, um die NULL-Zulässigkeit von berechneten Spalten in einer Tabelle zu untersuchen. Ein Ausdruck, der NULL-Werte zulässt, kann nur durch die Angabe von ISNULL mit der check_expression-Konstante in einen Ausdruck umgewandelt werden, der keine NULL-Werte zulässt. Die Konstante ist ein Wert ungleich NULL, durch den jedes NULL-Ergebnis ersetzt wird. Für berechnete Spalten, die auf CLR-benutzerdefinierten Typausdrücken (Common Language Runtime) basieren, ist die REFERENCES-Berechtigung für den Typ erforderlich.

  • PERSISTED
    Gibt an, dass das SQL Server Database Engine (Datenbankmodul) die berechneten Werte physisch in der Tabelle speichert und die Werte aktualisiert, wenn Spalten, von denen die berechnete Spalte abhängt, aktualisiert werden. Wenn Sie eine berechnete Spalte (mit PERSISTED) als persistente Spalte markieren, können Sie einen Index für eine berechnete Spalte erstellen, die deterministisch, jedoch nicht genau ist. Weitere Informationen finden Sie unter Indizes in berechneten Spalten. Alle berechneten Spalten, die als Partitionierungsspalten einer partitionierten Tabelle verwendet werden, müssen ausdrücklich als PERSISTED gekennzeichnet sein. computed_column_expression muss deterministisch sein, wenn PERSISTED angegeben wird.

  • ON { <partition_scheme> | filegroup | "default" }
    Gibt das Partitionsschema oder die Dateigruppe an, in der die Tabelle gespeichert wird. Wenn <partition_scheme> angegeben wird, soll die Tabelle eine partitionierte Tabelle sein, deren Partitionen in einem Satz aus einer oder mehreren in <partition_scheme> angegebenen Dateigruppen gespeichert werden. Wenn filegroup angegeben ist, wird die Tabelle in der genannten Dateigruppe gespeichert. Die Dateigruppe muss in der Datenbank vorhanden sein. Wenn "default" angegeben oder ON überhaupt nicht angegeben wird, wird die Tabelle in der Standarddateigruppe gespeichert. Der in CREATE TABLE angegebene Speichermechanismus einer Tabelle kann nachfolgend nicht mehr geändert werden.

    ON {<Partitionsscheme> | filegroup | "default"} kann auch in einer PRIMARY KEY- oder UNIQUE-Einschränkung angegeben werden. Diese Einschränkungen erstellen Indizes. Wenn filegroup angegeben ist, wird der Index in der genannten Dateigruppe gespeichert. Wenn "default" angegeben oder ON überhaupt nicht angegeben wird, wird der Index in derselben Dateigruppe wie die Tabelle gespeichert. Wenn die PRIMARY KEY- oder die UNIQUE-Einschränkung einen gruppierten Index erstellt, werden die Datenseiten für die Tabelle in derselben Dateigruppe wie der Index gespeichert. Wenn CLUSTERED angegeben wird oder ein gruppierter Index anderweitig durch die Einschränkung erstellt wird und ein Wert für <partition_scheme> angegeben wird, der von der Angabe für <partition_scheme> oder filegroup der Tabellendefinition abweicht (oder umgekehrt), wird nur die Einschränkungsdefinition berücksichtigt; der andere Wert wird ignoriert.

    HinweisHinweis

    In diesem Kontext stellt default kein Schlüsselwort dar. Es handelt sich um einen Bezeichner für die Standarddateigruppe, der begrenzt werden muss, wie z. B. in ON "default" oder ON [default]. Wenn "default" angegeben wird, muss die Option QUOTED_IDENTIFIER für die aktuelle Sitzung auf ON festgelegt sein. Dies ist die Standardeinstellung. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER (Transact-SQL).

    HinweisHinweis

    Nachdem Sie eine partitionierte Tabelle erstellt haben, erwägen Sie, die LOCK_ESCALATION-Option für die Tabelle auf AUTO festzulegen. Dies kann die Parallelität verbessern, indem die Sperren auf Partitionsebene (HoBT) statt auf Tabellenebene aktiviert werden. Weitere Informationen finden Sie unter ALTER TABLE (Transact-SQL).

  • TEXTIMAGE_ON { filegroup| "default" }
    Gibt an, dass die Spalten vom Typ text, ntext, image, xml, varchar(max), nvarchar(max) und varbinary(max) und eines CLR-benutzerdefinierten Typs (einschließlich Geometrie und Geografie) in der angegebenen Dateigruppe gespeichert werden.

    TEXTIMAGE_ON ist nicht zulässig, wenn die Tabelle keine Spalten für umfangreiche Werte enthält. TEXTIMAGE_ON darf nicht angegeben werden, wenn <partition_scheme> angegeben wird. Wenn "default" angegeben wird oder TEXTIMAGE_ON überhaupt nicht angegeben wird, werden die Spalten für umfangreiche Werte in der Standarddateigruppe gespeichert. Die in CREATE TABLE angegebene Speicherung einer Spalte für umfangreiche Werte kann nachfolgend nicht mehr geändert werden.

    HinweisHinweis

    In diesem Kontext stellt default kein Schlüsselwort dar. Es handelt sich um einen Bezeichner für die Standarddateigruppe, der begrenzt werden muss, wie z. B. in TEXTIMAGE_ON "default" oder TEXTIMAGE_ON [default]. Wenn "default" angegeben wird, muss die Option QUOTED_IDENTIFIER für die aktuelle Sitzung auf ON festgelegt sein. Dies ist die Standardeinstellung. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER (Transact-SQL).

  • FILESTREAM_ON { partition_scheme_name | filegroup | "default" }
    Gibt die Dateigruppe für FILESTREAM-Daten an.

    Wenn die Tabelle FILESTREAM-Daten enthält und partitioniert ist, muss die FILESTREAM_ON-Klausel eingeschlossen werden und ein Partitionsschema von FILESTREAM-Dateigruppen angeben. Dieses Partitionsschema muss die gleiche Partitionsfunktion und die gleichen Partitionsspalten wie das Partitionsschema der Tabelle verwenden. Andernfalls wird ein Fehler ausgelöst.

    Wenn die Tabelle nicht partitioniert ist, kann die FILESTREAM-Spalte nicht partitioniert werden. Die FILESTREAM-Daten für die Tabelle müssen in einer einzigen Dateigruppe gespeichert werden. Diese Dateigruppe wird in der FILESTREAM_ON-Klausel angegeben.

    Wenn die Tabelle nicht partitioniert und die FILESTREAM_ON-Klausel nicht angegeben ist, wird die FILESTREAM-Dateigruppe mit dem DEFAULT-Eigenschaftensatz verwendet. Wenn keine FILESTREAM-Dateigruppe vorhanden ist, wird ein Fehler ausgelöst.

    • Wie auch bei ON und TEXTIMAGE_ON kann der mit CREATE TABLE für FILESTREAM_ON festgelegte Wert nur in den folgenden Fällen geändert werden:

    • Eine CREATE INDEX-Anweisung konvertiert einen Heap in einen gruppierten Index. In diesem Fall kann eine andere FILESTREAM-Dateigruppe, ein anderes Partitionsschema oder NULL angegeben werden.

    • Eine DROP INDEX-Anweisung konvertiert einen gruppierten Index in einen Heap. In diesem Fall kann eine andere FILESTREAM-Dateigruppe, ein anderes Partitionsschema oder "default" angegeben werden.

    Für die Dateigruppe in der FILESTREAM_ON <filegroup>-Klausel bzw. für die einzelnen FILESTREAM-Dateigruppen im Partitionsschema muss jeweils eine Datei definiert sein. Diese Datei muss mit einer CREATE DATABASE-Anweisung oder einer ALTER DATABASE-Anweisung definiert werden, andernfalls wird ein Fehler ausgelöst.

    Verwandte FILESTREAM-Themen finden Sie unter Binary Large Object (BLOB)-Daten (SQL Server).

  • [ type_schema_name**.** ] type_name
    Gibt den Datentyp der Spalte sowie das Schema an, zu dem er gehört. Folgende Datentypen sind möglich:

    • Ein Systemdatentyp.

    • Ein Aliastyp, der auf einem SQL Server-Systemdatentyp basiert. Aliasdatentypen werden mit der CREATE TYPE-Anweisung erstellt, bevor sie in einer Tabellendefinition verwendet werden können. Die NULL- oder NOT NULL-Zuweisung für einen Aliasdatentyp lässt sich durch die entsprechende Angabe in einer CREATE TABLE-Anweisung überschreiben. Die Längenangabe kann jedoch nicht geändert werden; die Länge eines Aliasdatentyps kann nicht in einer CREATE TABLE-Anweisung angegeben werden.

    • Ein CLR-benutzerdefinierter Typ. CLR-benutzerdefinierte Typen werden mit der CREATE TYPE-Anweisung erstellt, bevor sie in einer Tabellendefinition verwendet werden können. Zum Erstellen einer Spalte, die auf einem CLR-benutzerdefinierten Typ basiert, ist die REFERENCES-Berechtigung für den Typ erforderlich.

    Wenn type_schema_name nicht angegeben ist, verweist SQL Server Database Engine (Datenbankmodul) auf type_name in der folgenden Reihenfolge:

    • SQL Server-Systemdatentyp.

    • Das Standardschema des aktuellen Benutzers in der aktuellen Datenbank.

    • Das dbo-Schema in der aktuellen Datenbank.

  • precision
    Die Genauigkeit für den angegebenen Datentyp. Weitere Informationen über gültige Genauigkeitswerte finden Sie unter Genauigkeit, Dezimalstellen und Länge.

  • scale
    Die Dezimalstellen für den angegebenen Datentyp. Weitere Informationen zu gültigen Dezimalstellenwerten finden Sie unter Genauigkeit, Dezimalstellen und Länge.

  • max
    Gilt nur für die Datentypen varchar, nvarchar und varbinary zum Speichern von 2^31 Bytes an Zeichen- und Binärdaten sowie von 2^30 Bytes an Unicode-Daten.

  • CONTENT
    Gibt an, dass jede Instanz des xml-Datentyps in column_name mehrere Elemente der obersten Ebene enthalten kann. CONTENT gilt nur für den xml-Datentyp und kann angegeben werden, wenn xml_schema_collection ebenfalls angegeben ist. Wird der Parameter nicht angegeben, entspricht CONTENT dem Standardverhalten.

  • DOCUMENT
    Gibt an, dass jede Instanz des xml-Datentyps in column_name nur ein Element der obersten Ebene enthalten kann. DOCUMENT gilt nur für den xml -Datentyp und kann angegeben werden, wenn xml_schema_collection ebenfalls angegeben ist.

  • xml_schema_collection
    Gilt nur für den xml-Datentyp zum Verknüpfen einer XML-Schemaauflistung mit dem Typ. Vor der Typisierung einer xml -Spalte mit einem Schema muss das Schema zuerst mithilfe von CREATE XML SCHEMA COLLECTION in der Datenbank erstellt werden.

  • DEFAULT
    Gibt den Wert an, der für die Spalte bereitgestellt wird, wenn kein Wert explizit angegeben wurde. DEFAULT-Definitionen können auf alle Spalten angewendet werden, mit Ausnahme der als timestamp definierten Spalten sowie von Spalten mit der IDENTITY-Eigenschaft. Wenn ein Standardwert für einen benutzerdefinierten Spaltentyp angegeben wird, sollte dieser Typ eine implizite Konvertierung von constant_expression in den benutzerdefinierten Typ unterstützen. DEFAULT-Definitionen werden entfernt, wenn die Tabelle gelöscht wird. Es kann nur ein konstanter Wert (z. B. eine Zeichenfolge), eine Skalarfunktion (entweder eine System-, eine benutzerdefinierte oder eine CLR-Funktion) oder NULL als Standardwert verwendet werden. Um die Kompatibilität mit früheren Versionen von SQL Server aufrechtzuerhalten, ist es möglich, einer DEFAULT-Definition einen Einschränkungsnamen zuzuweisen.

  • constant_expression
    Eine Konstante, ein NULL-Wert oder eine Systemfunktion, die bzw. der als Standardwert für die Spalte verwendet wird.

  • IDENTITY
    Gibt an, dass es sich bei der neuen Spalte um eine Identitätsspalte handelt. Wenn eine neue Zeile zur Tabelle hinzugefügt wird, stellt Database Engine (Datenbankmodul) einen eindeutigen, inkrementellen Wert für die Spalte bereit. Identitätsspalten werden üblicherweise zusammen mit PRIMARY KEY-Einschränkungen verwendet, um als eindeutiger Zeilenbezeichner für die Tabelle zu dienen. Die IDENTITY-Eigenschaft kann tinyint-, smallint-, int-, bigint-, decimal(p,0)- oder numeric(p,0)-Spalten zugewiesen werden. Es kann nur eine Identitätsspalte pro Tabelle erstellt werden. Gebundene Standardwerte und DEFAULT-Einschränkungen können nicht mit einer Identitätsspalte verwendet werden. Entweder müssen sowohl Ausgangswert als auch Schrittweite oder keines von beiden angegeben werden. Wurden Ausgangswert und inkrementeller Wert nicht angegeben, ist der Standardwert (1,1).

  • seed
    Der Wert, der für die erste in die Tabelle geladene Zeile verwendet wird.

  • increment
    Der Schrittweitenwert, der zum Identitätswert der zuvor geladenen Zeile addiert wird.

  • NOT FOR REPLICATION
    In der CREATE TABLE-Anweisung kann die NOT FOR REPLICATION-Klausel für die IDENTITY-Eigenschaft, für FOREIGN KEY-Einschränkungen und für CHECK-Einschränkungen angegeben werden. Wenn diese Klausel für die IDENTITY-Eigenschaft angegeben wird, werden Werte in Identitätsspalten nicht inkrementiert, wenn Replikations-Agents Einfügevorgänge ausführen. Wenn diese Klausel für eine Einschränkung angegeben wird, wird die Einschränkung nicht erzwungen, wenn Replikations-Agents Einfüge-, Update- oder Löschvorgänge ausführen.

  • ROWGUIDCOL
    Gibt an, dass die neue Spalte eine Spalte mit Zeilen-GUIDs ist. Nur eine uniqueidentifier -Spalte pro Tabelle kann als ROWGUIDCOL-Spalte angegeben werden. Nach der Anwendung der ROWGUIDCOL-Eigenschaft kann mit $ROWGUID auf die Spalte verwiesen werden. Die ROWGUIDCOL-Eigenschaft kann nur einer uniqueidentifier-Spalte zugewiesen werden. Spalten eines benutzerdefinierten Datentyps können nicht mit ROWGUIDCOL gekennzeichnet werden.

    Die ROWGUIDCOL-Eigenschaft erzwingt keine Eindeutigkeit der in der Spalte gespeicherten Werte. ROWGUIDCOL erzeugt auch nicht automatisch Werte für neue Zeilen, die in die Tabelle eingefügt werden. Zum Generieren eindeutiger Werte für jede Spalte verwenden Sie entweder die Funktion NEWID oder NEWSEQUENTIALID in INSERT-Anweisungen, oder verwenden Sie diese Funktionen als Standardwert für die Spalte.

  • SPARSE
    Gibt an, dass die Spalte eine Spalte mit geringer Dichte ist. Der Speicher für Spalten mit geringer Dichte ist für NULL-Werte optimiert. Spalten mit geringer Dichte können nicht als NOT NULL festgelegt werden. Weitere Einschränkungen und Informationen zu Spalten mit geringer Dichte finden Sie unter Verwenden von Spalten mit geringer Dichte.

  • FILESTREAM
    Gilt nur für varbinary(max)-Spalten. Gibt den FILESTREAM-Speicher für die varbinary(max)-BLOB-Daten an.

    Die Tabelle muss auch eine Spalte mit dem uniqueidentifier-Datentyp aufweisen, der das ROWGUIDCOL-Attribut enthält. Diese Spalte darf keine NULL-Werte zulassen und muss eine UNIQUE- oder eine PRIMARY KEY-Einschränkung für einzelne Spalten enthalten. Der GUID-Wert für die Spalte muss entweder beim Einfügen von Daten von einer Anwendung oder durch eine DEFAULT-Einschränkung mit der NEWID ()-Funktion bereitgestellt werden.

    Die Spalte ROWGUIDCOL kann nicht gelöscht, und die zugehörigen Einschränkungen können nicht geändert werden, wenn für die Tabelle eine FILESTREAM-Spalte definiert ist. Die Spalte ROWGUIDCOL kann nur gelöscht werden, nachdem die letzte FILESTREAM-Spalte gelöscht wurde.

    Wenn das FILESTREAM-Speicherattribut für eine Spalte angegeben wird, werden alle Werte dieser Spalte in einem FILESTREAM-Datencontainer des Dateisystems gespeichert.

  • COLLATE collation_name
    Gibt die Sortierung für die Spalte an. Als Sortierungsname kann entweder der Name einer Windows-Sortierreihenfolge oder ein SQL-Sortierungsname verwendet werden. collation_name gilt nur Spalten vom Datentyp char, varchar, text, nchar, nvarchar und ntext. Wenn collation_name nicht angegeben ist, wird der Spalte die Sortierung des benutzerdefinierten Datentyps zugewiesen, wenn es sich um eine Spalte von einem benutzerdefinierten Datentyp handelt, oder es wird die Standardsortierung der Datenbank zugewiesen.

    Weitere Informationen zu den Namen von Windows-Sortierreihenfolgen und zu SQL-Sortierungsnamen finden Sie unter /Name der Windows-Sortierreihenfolge und SQL-Sortierungsname.

    Weitere Informationen zur COLLATE-Klausel finden Sie unter COLLATE (Transact-SQL).

  • CONSTRAINT
    Ein optionales Schlüsselwort, das den Anfang der Definition einer PRIMARY KEY-, NOT NULL-, UNIQUE-, FOREIGN KEY- oder CHECK-Einschränkung anzeigt.

  • constraint_name
    Der Name einer Einschränkung. Einschränkungsnamen müssen innerhalb des Schemas, zu dem die Tabelle gehört, eindeutig sein.

  • NULL | NOT NULL
    Bestimmt, ob NULL-Werte in der Spalte zulässig sind. NULL ist genau genommen keine Einschränkung, kann jedoch genauso wie NOT NULL angegeben werden. NOT NULL kann nur dann für berechnete Spalten angegeben werden, wenn PERSISTED ebenfalls angegeben wird.

  • PRIMARY KEY
    Eine Einschränkung, die die Entitätsintegrität für eine bestimmte Spalte (oder Spalten) durch einen eindeutigen Index erzwingt. Es kann nur eine PRIMARY KEY-Einschränkung pro Tabelle erstellt werden.

  • UNIQUE
    Eine Einschränkung, die die Entitätsintegrität für eine bestimmte Spalte (oder Spalten) durch einen eindeutigen Index bietet. Eine Tabelle kann mehrere UNIQUE-Einschränkungen haben.

  • CLUSTERED | NONCLUSTERED
    Gibt an, dass ein gruppierter oder nicht gruppierter Index für die PRIMARY KEY- oder UNIQUE-Einschränkung erstellt wird. Für PRIMARY KEY-Einschränkungen wird standardmäßig CLUSTERED verwendet; für UNIQUE-Einschränkungen wird standardmäßig NONCLUSTERED verwendet.

    In einer CREATE TABLE-Anweisung kann CLUSTERED nur für eine einzige Einschränkung angegeben werden. Wenn Sie CLUSTERED für eine UNIQUE-Einschränkung angeben und außerdem eine PRIMARY KEY-Einschränkung angeben, wird für PRIMARY KEY standardmäßig NONCLUSTERED verwendet.

  • FOREIGN KEY REFERENCES
    Eine Einschränkung, die referenzielle Integrität für die Daten in der Spalte oder den Spalten gewährleistet. FOREIGN KEY-Einschränkungen erfordern, dass jeder Wert in der Spalte in den entsprechenden Spalten, auf die verwiesen wird, in der Tabelle, auf die verwiesen wird, vorhanden ist. FOREIGN KEY-Einschränkungen können nur auf Spalten verweisen, die PRIMARY KEY- oder UNIQUE-Einschränkungen in der Tabelle sind, auf die verwiesen wird; oder auf Spalten, auf die in einer UNIQUE INDEX-Einschränkung in der Tabelle, auf die verwiesen wird, verwiesen wird. Fremdschlüssel für berechnete Spalten müssen zudem (mit PERSISTED) als persistent markiert werden.

  • [ schema_name**.**] referenced_table_name]
    Der Name der Tabelle, auf die in der FOREIGN KEY-Einschränkung verwiesen wird, sowie das Schema, zu dem sie gehört.

  • ( ref_column [ ,... n ] )
    Eine Spalte oder Liste von Spalten aus der Tabelle, auf die die FOREIGN KEY-Einschränkung verweist.

  • ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
    Gibt an, welche Aktion für Zeilen in der erstellten Tabelle ausgeführt werden soll, wenn diese Zeilen eine referenzielle Beziehung aufweisen und die Zeile, auf die verwiesen wird, aus der übergeordneten Tabelle gelöscht wird. Der Standardwert ist NO ACTION.

    • NO ACTION
      Database Engine (Datenbankmodul) löst einen Fehler aus, und für die Aktion zum Löschen der Zeile in der übergeordneten Tabelle wird ein Rollback ausgeführt.

    • CASCADE
      Wenn diese Zeile aus der übergeordneten Tabelle gelöscht wird, werden die entsprechenden Zeilen aus der verweisenden Tabelle gelöscht.

    • SET NULL
      Alle Werte, aus denen sich der Fremdschlüssel zusammensetzt, werden auf NULL festgelegt, wenn die entsprechende Zeile in der übergeordneten Tabelle gelöscht wird. Damit diese Einschränkung ausgeführt werden kann, müssen die Fremdschlüsselspalten NULL-Werte zulassen.

    • SET DEFAULT
      Alle Werte, aus denen sich der Fremdschlüssel zusammensetzt, werden auf ihre Standardwerte festgelegt, wenn die entsprechende Zeile in der übergeordneten Tabelle gelöscht wird. Damit diese Einschränkung ausgeführt werden kann, müssen für alle Fremdschlüsselspalten Standarddefinitionen vorliegen. Wenn eine Spalte NULL-Werte zulässt, und es ist kein expliziter Standardwert festgelegt, wird NULL als der implizite Standardwert für die Spalte verwendet.

    Geben Sie CASCADE nicht an, wenn die Tabelle in eine Mergeveröffentlichung einbezogen werden soll, bei der logische Datensätze verwendet werden. Weitere Informationen zu logischen Datensätzen finden Sie unter Gruppieren von Änderungen an verknüpften Zeilen mithilfe von logischen Datensätzen.

    ON DELETE CASCADE kann nicht definiert werden, wenn für ON DELETE bereits ein INSTEAD OF-Trigger für die Tabelle vorhanden ist.

    In der AdventureWorks2012 -Datenbank verfügt die ProductVendor-Tabelle beispielsweise über eine referenzielle Beziehung zu der Vendor-Tabelle. Der ProductVendor.BusinessEntityID-Fremdschlüssel verweist auf den Vendor.BusinessEntityID-Primärschlüssel.

    Wenn eine DELETE-Anweisung für eine Zeile in der Vendor-Tabelle ausgeführt wird, und eine ON DELETE CASCADE-Aktion ist für ProductVendor.BusinessEntityID festgelegt, sucht Database Engine (Datenbankmodul) nach mindestens einer abhängigen Zeile in der ProductVendor-Tabelle. Falls eine solche Zeile vorhanden ist, werden die abhängigen Zeilen in der ProductVendor-Tabelle sowie die Zeile, auf die in der Vendor-Tabelle verwiesen wird, gelöscht.

    Wenn jedoch NO ACTION angegeben ist, löst das Database Engine (Datenbankmodul) einen Fehler aus und führt für die Löschaktion der Vendor-Zeile einen Rollback aus, falls sich mindestens eine Zeile in der ProductVendor-Tabelle befindet, die darauf verweist.

  • ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
    Gibt an, welche Aktion für eine Zeile der geänderten Tabelle ausgeführt werden soll, wenn diese Zeile eine referenzielle Beziehung hat und die Zeile, auf die verwiesen wird, in der übergeordneten Tabelle aktualisiert wird. Der Standardwert ist NO ACTION.

    • NO ACTION
      Database Engine (Datenbankmodul) löst einen Fehler aus, und für die Updateaktion der Zeile in der übergeordneten Tabelle wird ein Rollback ausgeführt.

    • CASCADE
      Wenn diese Zeile in der übergeordneten Tabelle aktualisiert wird, werden die entsprechenden Zeilen in der verweisenden Tabelle aktualisiert.

    • SET NULL
      Alle Werte, aus denen sich der Fremdschlüssel zusammensetzt, werden auf NULL festgelegt, wenn die entsprechende Zeile in der übergeordneten Tabelle aktualisiert wird. Die Fremdschlüsselspalten müssen NULL-Werte zulassen, um diese Einschränkung auszuführen.

    • SET DEFAULT
      Alle Werte, aus denen sich der Fremdschlüssel zusammensetzt, werden auf die Standardwerte festgelegt, wenn die entsprechende Zeile in der übergeordneten Tabelle aktualisiert wird. Alle Fremdschlüsselspalten müssen über Standarddefinitionen verfügen, um diese Einschränkung auszuführen. Wenn eine Spalte NULL-Werte zulässt, und es ist kein expliziter Standardwert festgelegt, wird NULL als der implizite Standardwert für die Spalte verwendet.

    Geben Sie CASCADE nicht an, wenn die Tabelle in eine Mergeveröffentlichung einbezogen werden soll, bei der logische Datensätze verwendet werden. Weitere Informationen zu logischen Datensätzen finden Sie unter Gruppieren von Änderungen an verknüpften Zeilen mithilfe von logischen Datensätzen.

    ON UPDATE CASCADE, SET NULL oder SET DEFAULT können nicht definiert werden, wenn für ON UPDATE schon ein INSTEAD OF-Trigger für die Tabelle vorhanden ist, die geändert wird.

    In der AdventureWorks2012 -Datenbank verfügt die ProductVendor-Tabelle z. B. über eine referenzielle Beziehung zur Vendor-Tabelle: Der Fremdschlüssel ProductVendor.BusinessEntity verweist auf den Primärschlüssel Vendor.BusinessEntityID.

    Wenn eine UPDATE-Anweisung für eine Zeile in der Vendor-Tabelle ausgeführt wird, und eine ON UPDATE CASCADE-Aktion ist für ProductVendor.BusinessEntityID festgelegt, sucht Database Engine (Datenbankmodul) nach mindestens einer abhängigen Zeile in der ProductVendor-Tabelle. Falls eine solche Zeile vorhanden ist, werden die abhängigen Zeilen in der ProductVendor-Tabelle sowie die Zeile, auf die in der Vendor-Tabelle verwiesen wird, aktualisiert.

    Wenn jedoch NO ACTION angegeben ist, löst das Database Engine (Datenbankmodul) einen Fehler aus und führt für die Updateaktion der Vendor-Zeile einen Rollback aus, falls sich mindestens eine Zeile in der ProductVendor-Tabelle befindet, die darauf verweist.

  • CHECK
    Eine Einschränkung, die Domänenintegrität erzwingt, indem die möglichen Eingabewerte für eine oder mehrere Spalten beschränkt wird. CHECK-Einschränkungen für berechnete Spalten müssen zudem (mit PERSISTED) als persistent markiert sein.

  • logical_expression
    Ein logischer Ausdruck, der TRUE oder FALSE zurückgibt. Aliasdatentypen können nicht Teil des Ausdrucks sein.

  • column
    Eine Spalte oder Liste von Spalten in Klammern, die in Tabelleneinschränkungen verwendet wird, um anzuzeigen, welche Spalten in der Einschränkungsdefinition verwendet werden.

  • [ ASC | DESC ]
    Gibt die Reihenfolge an, in der die Spalte oder die Spalten, die in der Tabelleneinschränkung enthalten sind, sortiert werden. Die Standardeinstellung ist ASC.

  • partition_scheme_name
    Der Name des Partitionsschemas, das die Dateigruppen definiert, denen die Partitionen einer partitionierten Tabelle zugeordnet werden. Das Partitionsschema muss in der Datenbank vorhanden sein.

  • [ partition_column_name**.** ]
    Gibt die Spalte an, auf deren Grundlage eine partitionierte Tabelle partitioniert wird. Die Spalte muss der in der Partitionsfunktion angegebenen Spalte entsprechen, die von partition_scheme_name im Hinblick auf Datentyp, Länge und Genauigkeit verwendet wird. Berechnete Spalten, die in eine Partitionsfunktion einbezogen werden, müssen explizit als PERSISTED gekennzeichnet sein.

    Wichtiger HinweisWichtig

    Es wird empfohlen, NOT NULL für die Partitionierungsspalte von partitionierten Tabellen sowie von nicht partitionierten Tabellen anzugeben, die als Quelle oder Ziel für ALTER TABLE...SWITCH-Vorgänge fungieren. Damit stellen Sie sicher, dass mit CHECK-Einschränkungen für Partitionierungsspalten keine Überprüfung auf NULL-Werte ausgeführt werden muss.

  • WITH FILLFACTOR **=**fillfactor
    Gibt an, wie weit das Database Engine (Datenbankmodul) die einzelnen Indexseiten füllen soll, die zum Speichern der Indexdaten verwendet werden. Vom Benutzer angegebene fillfactor-Werte können Zahlen von 1 bis 100 sein. Wenn kein Wert angegeben ist, lautet der Standardwert 0. Die Füllfaktorwerte 0 und 100 sind in jeder Hinsicht identisch.

    Wichtiger HinweisWichtig

    Das Dokumentieren von WITH FILLFACTOR = fillfactor als einzige Indexoption, die für die PRIMARY KEY- oder UNIQUE-Einschränkungen gilt, wird für die Abwärtskompatibilität beibehalten, dies wird jedoch in zukünftigen Versionen nicht mehr auf diese Weise dokumentiert werden.

  • column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
    Der Name des Spaltensatzes. Bei einem Spaltensatz handelt es sich um eine nicht typisierte XML-Darstellung, die alle Tabellenspalten mit geringer Dichte in einer strukturierten Ausgabe kombiniert. Weitere Informationen zu Spaltensätzen finden Sie unter Verwenden von Spaltensätzen.

  • < table_option> ::=
    Gibt eine oder mehrere Tabellenoptionen an.

  • DATA_COMPRESSION
    Gibt die Datenkomprimierungsoption für die angegebene Tabelle, die Partitionsnummer oder den Bereich von Partitionen an. Folgende Optionen stehen zur Verfügung:

    • NONE
      Die Tabelle bzw. die angegebenen Partitionen werden nicht komprimiert.

    • ROW
      Die Tabelle oder die angegebenen Partitionen werden mit Zeilenkomprimierung komprimiert.

    • PAGE
      Die Tabelle oder die angegebenen Partitionen werden mit Seitenkomprimierung komprimiert.

    Weitere Informationen zur Komprimierung finden Sie unter Datenkomprimierung.

  • ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )
    Gibt die Partitionen an, für die die DATA_COMPRESSION-Einstellung gilt. Wenn die Tabelle nicht partitioniert ist, erzeugt das ON PARTITIONS-Argument einen Fehler. Wenn die ON PARTITIONS-Klausel nicht angegeben wird, gilt die DATA_COMPRESSION-Option für alle Partitionen einer partitionierten Tabelle.

    <partition_number_expression> kann auf die folgenden Weisen angegeben werden:

    • Geben Sie die Partitionsnummer einer Partition an, beispielsweise: ON PARTITIONS (2).

    • Geben Sie die Partitionsnummern mehrerer einzelner Partitionen durch Trennzeichen getrennt an, beispielsweise: ON PARTITIONS (1, 5).

    • Geben Sie sowohl Bereiche als auch einzelne Partitionen an, beispielsweise: ON PARTITIONS (2, 4, 6 TO 8).

    Für Bereiche (<range>) können durch das Wort TO getrennte Partitionsnummern angegeben werden, beispielsweise: ON PARTITIONS (6 TO 8).

    Wenn Sie für verschiedene Partitionen unterschiedliche Datenkomprimierungstypen festlegen möchten, geben Sie die Option DATA_COMPRESSION mehrmals an, beispielsweise:

    WITH 
    (
    DATA_COMPRESSION = NONE ON PARTITIONS (1), 
    DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8), 
    DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
    )
    
  • <index_option> ::=
    Gibt eine oder mehrere Indexoptionen an. Eine vollständige Beschreibung dieser Optionen finden Sie unter CREATE INDEX (Transact-SQL).

  • PAD_INDEX = { ON | OFF }
    Bei der Einstellung ON wird der durch FILLFACTOR angegebene Prozentsatz des freien Speicherplatzes auf die Zwischenebenenseiten des Indexes angewendet. Wenn die Einstellung OFF verwendet wird oder kein FILLFACTOR-Wert angegeben wurde, werden die Zwischenebenenseiten fast bis zu ihrer Kapazitätsgrenze gefüllt, wobei ausreichend Speicherplatz für mindestens eine Zeile mit der maximal für diesen Index möglichen Größe frei bleibt; diese ergibt sich aus der Schlüsselmenge auf den Zwischenseiten. Die Standardeinstellung ist OFF.

  • FILLFACTOR **=**fillfactor
    Gibt einen Prozentsatz an, der anzeigt, wie weit Database Engine (Datenbankmodul) die Blattebene jeder Indexseite während der Indexerstellung oder -änderung füllen soll. fillfactor muss ein ganzzahliger Wert zwischen 1 und 100 sein. Die Standardeinstellung ist 0. Die Füllfaktorwerte 0 und 100 sind in jeder Hinsicht identisch.

  • IGNORE_DUP_KEY = { ON | OFF }
    Gibt die Fehlermeldung an, wenn ein Einfügevorgang versucht, doppelte Schlüsselwerte in einen eindeutigen Index einzufügen. Die IGNORE_DUP_KEY-Option gilt nur für Einfügevorgänge nach dem Erstellen oder Neuerstellen des Index. Beim Ausführen von CREATE INDEX, ALTER INDEX oder UPDATE hat die Option keine Auswirkungen. Die Standardeinstellung ist OFF.

    • ON
      Eine Warnmeldung wird ausgegeben, wenn doppelte Schlüsselwerte in einen eindeutigen Index eingefügt werden. Es schlagen nur die Zeilen fehl, die gegen die Eindeutigkeitseinschränkung verstoßen.

    • OFF
      Eine Fehlermeldung wird ausgegeben, wenn doppelte Schlüsselwerte in einen eindeutigen Index eingefügt werden. Für den gesamten INSERT-Vorgang wird ein Rollback ausgeführt.

    IGNORE_DUP_KEY kann für Indizes, die für eine Sicht erstellt werden, nicht eindeutige Indizes, XML-Indizes, räumliche und gefilterte Indizes nicht auf ON festgelegt werden.

    Um IGNORE_DUP_KEY anzuzeigen, verwenden Sie sys.indexes.

    In abwärtskompatibler Syntax ist WITH IGNORE_DUP_KEY gleichwertig mit WITH IGNORE_DUP_KEY = ON.

  • STATISTICS_NORECOMPUTE = { ON | OFF }
    Bei der Einstellung ON werden veraltete Indexstatistiken nicht automatisch neu berechnet. Bei der Einstellung OFF sind automatische Statistikupdates aktiviert. Die Standardeinstellung ist OFF.

  • ALLOW_ROW_LOCKS = { ON | OFF }
    Bei der Einstellung ON sind Zeilensperren beim Zugriff auf den Index zulässig. Das Database Engine (Datenbankmodul) bestimmt, wann Zeilensperren verwendet werden. Bei OFF werden Zeilensperren nicht verwendet. Die Standardeinstellung ist ON.

  • ALLOW_PAGE_LOCKS = { ON | OFF }
    Bei der Einstellung ON sind Seitensperren beim Zugriff auf den Index zulässig. Die Database Engine (Datenbankmodul) bestimmt, wann Seitensperren verwendet werden. Bei der Einstellung OFF werden Seitensperren nicht verwendet. Die Standardeinstellung ist ON.

  • FILETABLE_DIRECTORY = directory_name
    Gibt den Windows-kompatiblen FileTable-Verzeichnisnamen an. Dieser Name sollte für alle FileTable-Verzeichnisnamen in der Datenbank eindeutig sein. Bei Eindeutigkeitsvergleichen wird unabhängig von den Sortiereinstellungen die Groß-/Kleinschreibung nicht beachtet. Wenn dieser Wert nicht angegeben ist, wird Name der Dateitabelle verwendet.

  • FILETABLE_COLLATE_FILENAME = { collation_name | database_default }
    Gibt den Namen der Sortierung an, die auf die Name-Spalte in der FileTable angewendet werden soll. Zur Einhaltung der Windows-Dateinamensemantik darf bei der Sortierung die Groß-/Kleinschreibung nicht beachtet werden. Wenn dieser Wert nicht angegeben ist, wird die Standardsortierung für die Datenbank verwendet. Wenn bei der Datenbank-Standardsortierung die Groß-/Kleinschreibung beachtet wird, wird ein Fehler ausgelöst, und der CREATE TABLE-Vorgang kann nicht durchgeführt werden.

    • collation_name
      Der Name einer Sortierung, bei der die Groß-/Kleinschreibung nicht beachtet wird.

    • database_default
      Gibt an, dass die Standardsortierung für die Datenbank verwendet werden soll. Bei dieser Sortierung darf die Groß-/Kleinschreibung nicht beachtet werden.

  • FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name
    Gibt den Namen an, der für die Primärschlüsseleinschränkung verwendet werden soll, die automatisch für die FileTable erstellt wird. Wenn dieser Wert nicht angegeben ist, wird ein Name für die Einschränkung generiert.

  • FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name
    Gibt den Namen an, der für die eindeutige Einschränkung verwendet werden soll, die automatisch für die stream_id-Spalte der FileTable erstellt wird. Wenn dieser Wert nicht angegeben ist, wird ein Name für die Einschränkung generiert.

  • FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name
    Gibt den Namen an, der für die eindeutige Einschränkung verwendet werden soll, die automatisch für die Spalten parent_path_locator und name in der FileTable erstellt wird. Wenn dieser Wert nicht angegeben ist, wird ein Name für die Einschränkung generiert.

Hinweise

Informationen zur Anzahl zulässiger Tabellen, Spalten, Einschränkungen und Indizes finden Sie unter Spezifikationen der maximalen Kapazität für SQL Server.

Der Speicherplatz für Tabellen und Indizes wird i. A. jeweils blockweise zugeordnet. Beim Erstellen der Tabelle oder des Indexes werden Seiten aus gemischten Blöcken zugeordnet, bis die Seiten für einen einheitlichen Block ausreichen. Wenn genügend Seiten für einen einheitlichen Block vorhanden sind, wird jedes Mal dann ein weiterer Block zugeordnet, wenn die bereits zugeordneten Blöcke voll sind. Um einen Bericht darüber zu erhalten, wie viel Speicherplatz für eine Tabelle zugeordnet ist und von ihr verwendet wird, führen Sie sp_spaceused aus.

Das Database Engine (Datenbankmodul) erzwingt keine Reihenfolge für die Angabe von DEFAULT, IDENTITY, ROWGUIDCOL oder Spalteneinschränkungen in einer Spaltendefinition.

Beim Erstellen einer Tabelle wird die Option QUOTED IDENTIFIER immer mit der Einstellung ON in den Metadaten der Tabelle gespeichert, und zwar auch dann, wenn die Option beim Erstellen der Tabelle auf OFF festgelegt ist.

Temporäre Tabellen

Sie können sowohl lokale als auch globale temporäre Tabellen erstellen. Lokale temporäre Tabellen sind nur während der aktuellen Sitzung sichtbar; globale temporäre Tabellen sind von allen Sitzungen aus sichtbar. Temporäre Tabellen können nicht partitioniert werden.

Stellen Sie lokalen temporären Tabellennamen ein einzelnes Nummernzeichen (#table_name) und globalen temporären Tabellennamen ein doppeltes Nummernzeichen voran (##table_name).

SQL-Anweisungen verweisen auf die temporäre Tabelle, indem sie den in der CREATE TABLE-Anweisung angegebenen Wert für table_name verwenden. Beispiel:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY);

INSERT INTO #MyTempTable VALUES (1);

Wenn mehr als eine temporäre Tabelle innerhalb einer einzigen gespeicherten Prozedur oder innerhalb eines Batches erstellt wird, müssen verschiedene Namen für die temporären Tabellen verwendet werden.

Wenn eine lokale temporäre Tabelle in einer gespeicherten Prozedur oder einer Anwendung erstellt wird, die von mehreren Benutzern gleichzeitig ausgeführt werden kann, muss es dem Database Engine (Datenbankmodul) möglich sein, die von den verschiedenen Benutzern erstellten Tabellen zu unterscheiden. Zu diesem Zweck fügt das Database Engine (Datenbankmodul) intern ein numerisches Suffix an alle Namen lokaler temporärer Tabellen an. Der vollständige, in der sysobjects-Tabelle von tempdb gespeicherte Name einer temporären Tabelle besteht aus dem in der CREATE TABLE-Anweisung angegebenen Tabellennamen und dem vom System generierten numerischen Suffix. Damit das Suffix angefügt werden kann, darf table_name für eine lokale temporäre Tabelle nicht länger als 116 Zeichen sein.

Temporäre Tabellen werden automatisch gelöscht, wenn sie nicht mehr gültig sind, es sei denn, sie wurden bereits explizit mithilfe von DROP TABLE gelöscht:

  • Eine lokale temporäre Tabelle, die in einer gespeicherten Prozedur erstellt wurde, wird bei Beendigung der gespeicherten Prozedur automatisch gelöscht. Auf die Tabelle kann durch geschachtelte gespeicherte Prozeduren verwiesen werden, die von der gespeicherten Prozedur ausgeführt werden, die die Tabelle erstellt hat. Auf die Tabelle kann nicht durch den Vorgang verwiesen werden, der die gespeicherte Prozedur, die die Tabelle erstellt hat, aufgerufen hat.

  • Alle anderen lokalen temporären Tabellen werden am Ende der aktuellen Sitzung automatisch gelöscht.

  • Eine globale temporäre Tabelle wird automatisch gelöscht, wenn die Sitzung, die die betreffende Tabelle erstellt hat, beendet wird und kein Task mehr auf die Tabelle verweist. Die Zuordnung zwischen einem Task und einer Tabelle wird nur für die Dauer einer einzelnen Transact-SQL-Anweisung aufrechterhalten. Das bedeutet, dass eine globale temporäre Tabelle bei Beendigung der letzten Transact-SQL-Anweisung gelöscht wird, die aktiv auf die Tabelle verwiesen hat, als die Sitzung, die die Tabelle erstellt hat, beendet wurde.

Eine lokale temporäre Tabelle, die in einer gespeicherten Prozedur oder einem Trigger erstellt wurde, kann den gleichen Namen wie eine temporäre Tabelle haben, die vor dem Aufruf der gespeicherten Prozedur oder des Triggers erstellt wurde. Wenn jedoch eine Abfrage auf eine temporäre Tabelle verweist und zu diesem Zeitpunkt zwei temporäre Tabellen mit demselben Namen vorhanden sind, ist nicht definiert, anhand welcher Tabelle die Abfrage aufgelöst werden soll. Eine geschachtelte gespeicherte Prozedur kann ebenfalls eine temporäre Tabelle mit demselben Namen wie eine temporäre Tabelle erstellen, die von der gespeicherten Prozedur erstellt wurde, die die geschachtelte gespeicherte Prozedur aufgerufen hat. Damit jedoch Änderungsanweisungen anhand der Tabelle aufgelöst werden können, die in der geschachtelten Prozedur erstellt wurde, muss die Tabelle die gleiche Struktur mit den gleichen Spaltennamen wie die Tabelle aufweisen, die in der aufrufenden Prozedur erstellt wurde. Dies wird im folgenden Beispiel gezeigt.

CREATE PROCEDURE dbo.Test2
AS
    CREATE TABLE #t(x INT PRIMARY KEY);
    INSERT INTO #t VALUES (2);
    SELECT Test2Col = x FROM #t;
GO

CREATE PROCEDURE dbo.Test1
AS
    CREATE TABLE #t(x INT PRIMARY KEY);
    INSERT INTO #t VALUES (1);
    SELECT Test1Col = x FROM #t;
EXEC Test2;
GO

CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO

EXEC Test1;
GO

Dies ist das Resultset.

(1 row(s) affected)

Test1Col

-----------

1

(1 row(s) affected)

Test2Col

-----------

2

Beim Erstellen lokaler oder globaler temporärer Tabellen unterstützt die Syntax der CREATE TABLE-Anweisung Einschränkungsdefinitionen mit Ausnahme von FOREIGN KEY-Einschränkungen. Wenn eine FOREIGN KEY-Einschränkung in einer temporären Tabelle angegeben wird, gibt die Anweisung ein Warnmeldung zurück, die besagt, dass die Einschränkung nicht berücksichtigt wurde. Die Tabelle wird dennoch, jedoch ohne die FOREIGN KEY-Einschränkungen erstellt. In FOREIGN KEY-Einschränkungen kann nicht auf temporäre Tabellen verwiesen werden.

Wenn eine temporäre Tabelle mit einer benannten Einschränkung und innerhalb des Bereichs einer benutzerdefinierten Transaktion erstellt wird, kann jeweils nur ein Benutzer die Anweisung ausführen, mit der die temporäre Tabelle erstellt wird. Wenn zum Beispiel eine gespeicherte Prozedur eine temporäre Tabelle mit einer benannten Primärschlüsseleinschränkung erstellt, kann die gespeicherte Prozedur nicht von mehreren Benutzern gleichzeitig ausgeführt werden.

Partitionierte Tabellen

Bevor eine partitionierte Tabelle mithilfe von CREATE TABLE erstellt wird, müssen Sie zuerst eine Partitionsfunktion erstellen, um anzugeben, wie die Tabelle partitioniert werden soll. Eine Partitionsfunktion wird mit CREATE PARTITION FUNCTION erstellt. Darüber hinaus müssen Sie ein Partitionsschema erstellen, um die Dateigruppen anzugeben, die die von der Partitionsfunktion angegebenen Partitionen aufnehmen. Ein Partitionsschema wird mit CREATE PARTITION SCHEME erstellt. Das Platzieren von PRIMARY KEY- oder UNIQUE-Einschränkungen in verschiedenen Dateigruppen ist bei partitionierten Tabellen nicht möglich. Weitere Informationen finden Sie unter Partitionierte Tabellen und Indizes.

PRIMARY KEY-Einschränkungen

  • Eine Tabelle kann nur eine PRIMARY KEY-Einschränkung enthalten.

  • Der durch eine PRIMARY KEY-Einschränkung generierte Index kann nicht dazu führen, dass die Anzahl der Indizes der Tabelle 999 nicht gruppierte Indizes und 1 gruppierten Index übersteigt.

  • Wenn CLUSTERED oder NONCLUSTERED für eine PRIMARY KEY-Einschränkung nicht angegeben ist, wird CLUSTERED verwendet, sofern keine gruppierten Indizes für UNIQUE-Einschränkungen angegeben sind.

  • Alle Spalten, für die eine PRIMARY KEY-Einschränkung definiert wurde, müssen als NOT NULL definiert sein. Falls weder NULL noch NOT NULL angegeben ist, wird für alle Spalten, auf die eine PRIMARY KEY-Einschränkung angewendet wird, die NULL-Zulässigkeit auf NOT NULL festgelegt.

  • Wenn ein Primärschlüssel für eine Spalte eines CLR-benutzerdefinierten Typs definiert wird, muss die Implementierung des Typs eine binäre Sortierreihenfolge unterstützen. Weitere Informationen finden Sie unter Benutzerdefinierte CLR-Typen.

UNIQUE-Einschränkungen

  • Wenn CLUSTERED oder NONCLUSTERED für eine UNIQUE-Einschränkung nicht angegeben ist, wird standardmäßig NONCLUSTERED verwendet.

  • Jede UNIQUE-Einschränkung erzeugt einen Index. Die Anzahl der UNIQUE-Einschränkungen kann nicht dazu führen, dass die Anzahl der Indizes der Tabelle 999 nicht gruppierte Indizes und 1 gruppierten Index übersteigt.

  • Wenn eine UNIQUE-Einschränkung für eine Spalte eines CLR-benutzerdefinierten Typs definiert wird, muss die Implementierung des Typs eine binäre oder operatorbasierte Sortierreihenfolge unterstützen. Weitere Informationen finden Sie unter Benutzerdefinierte CLR-Typen.

FOREIGN KEY-Einschränkungen

  • Wenn ein anderer Wert als NULL in die Spalte einer FOREIGN KEY-Einschränkung eingegeben wird, muss der Wert in der Spalte vorhanden sein, auf die verwiesen wird; andernfalls wird eine Fremdschlüsselverletzungs-Fehlermeldung zurückgegeben.

  • FOREIGN KEY-Einschränkungen werden auf die vorangegangene Spalte angewendet, es sei denn, es werden Quellspalten angegeben.

  • FOREIGN KEY-Einschränkungen können nur auf Tabellen verweisen, die sich innerhalb derselben Datenbank auf demselben Server befinden. Datenbankübergreifende referenzielle Integrität muss durch Trigger implementiert werden. Weitere Informationen finden Sie unter CREATE TRIGGER (Transact-SQL).

  • FOREIGN KEY-Einschränkungen können auf eine andere Spalte in derselben Tabelle verweisen. Ein solcher Verweis wird als Eigenverweis bezeichnet.

  • Die REFERENCES-Klausel einer FOREIGN KEY-Einschränkung auf Spaltenebene kann nur eine Verweisspalte auflisten. Diese Spalte muss denselben Datentyp aufweisen wie die Spalte, für die die Einschränkung definiert wurde.

  • Die REFERENCES-Klausel einer FOREIGN KEY-Einschränkung auf Tabellenebene muss ebenso viele Verweisspalten haben, wie sich Spalten in der Einschränkungsspaltenliste befinden. Der Datentyp jeder Verweisspalte muss ebenfalls mit dem der entsprechenden Spalte in der Spaltenliste übereinstimmen.

  • CASCADE, SET NULL oder SET DEFAULT kann nicht angegeben werden, wenn eine Spalte vom Typ timestamp Teil des Fremdschlüssels oder des Schlüssels ist, auf den verwiesen wird.

  • CASCADE, SET NULL, SET DEFAULT und NO ACTION können für Tabellen kombiniert werden, die referenzielle Beziehungen untereinander aufweisen. Wenn das Database Engine (Datenbankmodul) die Einstellung NO ACTION feststellt, wird die Verarbeitung beendet und ein Rollback für verbundene CASCADE-, SET NULL- und SET DEFAULT-Aktionen ausgeführt. Wenn eine DELETE-Anweisung eine Kombination aus CASCADE-, SET NULL-, SET DEFAULT- und NO ACTION-Aktionen bewirkt, werden alle CASCADE-, SET NULL- und SET DEFAULT-Aktionen angewendet, bevor das Database Engine (Datenbankmodul) nach der möglichen Angabe von NO ACTION sucht.

  • Das Database Engine (Datenbankmodul) verfügt über keine vordefinierte Grenze hinsichtlich der Anzahl von FOREIGN KEY-Einschränkungen, die eine Tabelle, die auf andere Tabellen verweist, enthalten kann, oder hinsichtlich der Anzahl von FOREIGN KEY-Einschränkungen im Besitz anderer Tabellen, die auf eine bestimmte Tabelle verweisen.

    Nichtsdestotrotz ist die tatsächliche Anzahl von FOREIGN KEY-Einschränkungen , die verwendet werden können, durch die Hardwarekonfiguration und den Entwurf der Datenbank und der Anwendung begrenzt. Als Empfehlung gilt, dass eine Tabelle maximal 253 FOREIGN KEY-Einschränkungen enthalten sollte und dass maximal 253 FOREIGN KEY-Einschränkungen auf eine Tabelle verweisen sollten. Die in Ihrem Fall tatsächlich gültige Grenze kann je nach Anwendung und Hardware darüber oder darunter liegen. Beim Entwerfen von Datenbank und Anwendungen sollten Sie die Kosten für das Erzwingen von FOREIGN KEY-Einschränkungen berücksichtigen.

  • FOREIGN KEY-Einschränkungen werden nicht auf temporäre Tabellen angewendet.

  • FOREIGN KEY-Einschränkungen können nur auf Spalten in PRIMARY KEY- oder UNIQUE-Einschränkungen in der Tabelle, auf die verwiesen wird, oder auf eine UNIQUE INDEX-Einschränkung für die Tabelle, auf die verwiesen wird, verweisen.

  • Wenn ein Fremdschlüssel für eine Spalte eines CLR-benutzerdefinierten Typs definiert wird, muss die Implementierung des Typs eine binäre Sortierreihenfolge unterstützen. Weitere Informationen finden Sie unter Benutzerdefinierte CLR-Typen.

  • Für Spalten, die an einer Fremdschlüsselbeziehung beteiligt sind, muss die gleiche Länge und Skala definiert sein.

DEFAULT-Definitionen

  • Eine Spalte kann nur eine DEFAULT-Definition haben.

  • Eine DEFAULT-Definition kann konstante Werte, Funktionen, SQL-92-Funktionen ohne Argumente oder NULL enthalten. Die folgende Tabelle zeigt die Funktionen ohne Argumente und die Werte, die sie während einer INSERT-Anweisung für den Standardwert zurückgeben.

    SQL-92-Funktion ohne Argumente

    Rückgabewert

    CURRENT_TIMESTAMP

    Aktuelles Datum und aktuelle Uhrzeit.

    CURRENT_USER

    Name des Benutzers, der einen Einfügevorgang ausführt.

    SESSION_USER

    Name des Benutzers, der einen Einfügevorgang ausführt.

    SYSTEM_USER

    Name des Benutzers, der einen Einfügevorgang ausführt.

    USER

    Name des Benutzers, der einen Einfügevorgang ausführt.

  • constant_expression in einer DEFAULT-Definition kann nicht auf eine andere Spalte in der Tabelle oder auf andere Tabellen, Sichten oder gespeicherte Prozeduren verweisen.

  • DEFAULT-Definitionen können nicht für Spalten mit einem timestamp-Datentyp oder für Spalten mit IDENTITY-Eigenschaft erstellt werden.

  • DEFAULT-Definitionen können nicht für Spalten mit Aliasdatentypen erstellt werden, wenn der Aliasdatentyp an ein Standardobjekt gebunden ist.

CHECK-Einschränkungen

  • Eine Spalte kann beliebig viele CHECK-Einschränkungen haben, und die Bedingung kann mehrere logische Ausdrücke enthalten, die mit AND und OR verknüpft sind. Mehrere CHECK-Einschränkungen für eine Spalte werden in der Reihenfolge überprüft, in der sie erstellt wurden.

  • Die Suchbedingung muss einen booleschen Ausdruck ergeben und darf nicht auf eine andere Tabelle verweisen.

  • Eine CHECK-Einschränkung auf Spaltenebene kann nur auf die von der Einschränkung betroffene Spalte verweisen, und eine CHECK-Einschränkung auf Tabellenebene kann nur auf Spalten derselben Tabelle verweisen.

    CHECK-Einschränkungen und Regeln dienen beide zur Überprüfung der Daten während INSERT- und UPDATE-Anweisungen.

  • Sobald eine Regel und mindestens eine CHECK-Einschränkung für eine oder mehrere Spalten vorhanden sind, werden alle Einschränkungen ausgewertet.

  • CHECK-Einschränkungen können nicht für Spalten vom Typ text, ntext oder image definiert werden.

Weitere Informationen zu Einschränkungen

  • Ein für eine Einschränkung erstellter Index kann nicht mit der DROP INDEX-Anweisung gelöscht werden. Die Einschränkung muss mithilfe von ALTER TABLE gelöscht werden. Ein Index, der für eine Einschränkung erstellt wurde und von ihr verwendet wird, kann mithilfe von ALTER INDEX...REBUILD neu erstellt werden. Weitere Informationen finden Sie unter Neuorganisieren und Neuerstellen von Indizes.

  • Einschränkungsnamen müssen den Regeln für Bezeichner entsprechen, wobei der Name jedoch nicht mit einem Nummernzeichen (#) anfangen darf. Wenn constraint_name nicht angegeben ist, vergibt das System einen Namen für die Einschränkung. Der Einschränkungsname wird in jeder Fehlermeldung über Einschränkungsverletzungen angezeigt.

  • Wenn eine Einschränkung in einer INSERT-, UPDATE- oder DELETE-Anweisung verletzt wird, wird die Anweisung beendet. Wenn SET XACT_ABORT jedoch auf OFF festgelegt ist, wird die Verarbeitung der Transaktion – falls die Anweisung Teil einer expliziten Transaktion ist – fortgesetzt. Wenn SET XACT_ABORT auf ON festgelegt ist, wird für die ganze Transaktion ein Rollback ausgeführt. Sie können auch die ROLLBACK TRANSACTION-Anweisung mit der Transaktionsdefinition verwenden, indem Sie die @@ERROR-Systemfunktion prüfen.

  • Wenn ALLOW_ROW_LOCKS auf ON und ALLOW_PAGE_LOCK auf ON festgelegt ist, sind Sperren auf Zeilen-, Seiten- und Tabellenebene beim Zugriff auf den Index zulässig. Database Engine (Datenbankmodul) wählt die entsprechende Sperre aus und kann diese von einer Zeilen- oder Seitensperre auf eine Tabellensperre ausweiten. Wenn ALLOW_ROW_LOCKS auf OFF und ALLOW_PAGE_LOCK auf OFF festgelegt sind, sind beim Zugriff auf den Index nur Sperren auf Tabellenebene zulässig.

  • Wenn eine Tabelle FOREIGN KEY- oder CHECK-Einschränkungen und Trigger hat, werden die Einschränkungsbedingungen ausgewertet, bevor der Trigger ausgeführt wird.

Um einen Bericht über eine Tabelle und deren Spalten zu erhalten, verwenden Sie sp_help oder sp_helpconstraint. Zum Umbenennen einer Tabelle verwenden Sie sp_rename. Verwenden Sie für einen Bericht zu den Sichten und gespeicherten Prozeduren, die von einer Tabelle abhängen, sys.dm_sql_referenced_entities und sys.dm_sql_referencing_entities.

NULL-Zulässigkeitsregeln in einer Tabellendefinition

Die NULL-Zulässigkeit einer Spalte bestimmt, ob diese Spalte NULL als Datenwert enthalten kann. NULL ist nicht Null oder leer. NULL bedeutet, dass kein Eintrag vorgenommen oder explizit NULL angegeben wurde, und impliziert üblicherweise, dass der Wert entweder unbekannt oder nicht anwendbar ist.

Wenn Sie CREATE TABLE- oder ALTER TABLE verwenden, um eine Tabelle zu erstellen bzw. zu ändern, wird die NULL-Zulässigkeit des in einer Spaltendefinition verwendeten Datentyps durch Datenbank- und Sitzungseinstellungen beeinflusst und möglicherweise überschrieben. Es empfiehlt sich, bei nicht berechneten Spalten stets explizit NULL oder NOT NULL für die Spalte anzugeben oder, im Falle eines benutzerdefinierten Datentyps, zuzulassen, dass die Spalte die standardmäßige NULL-Zulässigkeit des Datentyps verwendet. Spalten mit geringer Dichte müssen immer NULL zulassen.

Wenn die NULL-Zulässigkeit der Spalte nicht explizit angegeben ist, wird sie gemäß den in der folgenden Tabelle aufgeführten Regeln hergeleitet.

Datentyp der Spalte

Regel

Aliasdatentyp

Das Database Engine (Datenbankmodul) verwendet die NULL-Zulässigkeit, die beim Erstellen des Datentyps angegeben wurde. Zum Bestimmen der standardmäßigen NULL-Zulässigkeit des Datentyps verwenden Sie sp_help.

CLR-benutzerdefinierter Typ

Die NULL-Zulässigkeit wird gemäß der Spaltendefinition bestimmt.

Vom System bereitgestellter Datentyp

Wenn es für den vom System bereitgestellten Datentyp nur eine Option gibt, hat diese Vorrang. Für timestamp-Datentypen muss NOT NULL angegeben werden.

Wenn Sitzungseinstellungen mithilfe von SET auf ON festgelegt werden, gilt Folgendes:

  • Wenn ANSI_NULL_DFLT_ON auf ON festgelegt ist, wird NULL zugewiesen.

  • Wenn ANSI_NULL_DFLT_OFF auf ON festgelegt ist, wird NOT NULL zugewiesen.

  • Wenn Datenbankeinstellungen mithilfe von ALTER DATABASE konfiguriert werden, gilt Folgendes:

  • Wenn ANSI_NULL_DEFAULT_ON auf ON festgelegt ist, wird NULL zugewiesen.

  • Wenn ANSI_NULL_DEFAULT_OFF auf ON festgelegt ist, wird NOT NULL zugewiesen.

  • Zum Anzeigen der Datenbankeinstellungen für ANSI_NULL_DEFAULT verwenden Sie die sys.databases-Katalogsicht.

Wenn keine der ANSI_NULL_DFLT-Optionen für die Sitzung festgelegt wurde und für die Datenbank die Standardeinstellung gilt (ANSI_NULL_DEFAULT ist auf OFF festgelegt), wird der Standardwert NOT NULL zugewiesen.

Wenn es sich bei der Spalte um eine berechnete Spalte handelt, wird die NULL-Zulässigkeit stets automatisch durch das Database Engine (Datenbankmodul) bestimmt. Zum Bestimmen der NULL-Zulässigkeit dieser Art von Spalte verwenden Sie die COLUMNPROPERTY-Funktion mit der AllowsNull-Eigenschaft.

HinweisHinweis

Für den SQL Server-ODBC-Treiber und den Microsoft OLE DB Provider für SQL Server ist ANSI_NULL_DFLT_ON standardmäßig auf ON festgelegt. ODBC- und OLE DB-Benutzer können dies in ODBC-Datenquellen oder mit von der Anwendung festgelegten Verbindungsattributen oder -eigenschaften konfigurieren.

Datenkomprimierung

Für Systemtabellen ist die Komprimierung nicht verfügbar. Bei Erstellung einer Tabelle wird die Datenkomprimierung auf NONE festgelegt, falls nicht anders angegeben. Wenn Sie eine Partitionsliste bzw. eine Partition außerhalb des zulässigen Bereichs angeben, wird ein Fehler generiert. Weitere Informationen zur Datenkomprimierung finden Sie unter Datenkomprimierung.

Mit der gespeicherten Prozedur sp_estimate_data_compression_savings können Sie evaluieren, wie sich eine Änderung des Komprimierungsstatus auf eine Tabelle, einen Index oder eine Partition auswirkt.

Berechtigungen

Es sind die CREATE TABLE-Berechtigung in der Datenbank und die ALTER-Berechtigung für das Schema erforderlich, in der die Tabelle erstellt wird.

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

Wenn einer Spalte in der CREATE TABLE-Anweisung eine XML-Schemaauflistung zugeordnet ist, ist entweder der Besitz der XML-Schemaauflistung oder die REFERENCES-Berechtigung für die Auflistung erforderlich.

Jeder Benutzer ist berechtigt, temporäre Tabellen in tempdb zu erstellen.

Beispiele

A.Erstellen einer PRIMARY KEY-Einschränkung für eine Spalte

Im folgenden Beispiel ist die Spaltendefinition für eine PRIMARY KEY-Einschränkung dargestellt, die über einen gruppierten Index für die EmployeeID-Spalte der Employee-Tabelle verfügt. Da kein Einschränkungsname angegeben ist, wird der Einschränkungsname vom System angegeben.

CREATE TABLE dbo.Employee (EmployeeID int
PRIMARY KEY CLUSTERED);

B.Verwenden von FOREIGN KEY-Einschränkungen

Eine FOREIGN KEY-Einschränkung wird zum Verweisen auf eine andere Tabelle verwendet. Fremdschlüssel können einspaltige oder mehrspaltige Schlüssel sein. Dieses Beispiel zeigt eine einspaltige FOREIGN KEY-Einschränkung für die SalesOrderHeader-Tabelle, die auf die SalesPerson-Tabelle verweist. Für eine einspaltige FOREIGN KEY-Einschränkung wird nur die REFERENCES-Klausel benötigt.

SalesPersonID int NULL
REFERENCES SalesPerson(SalesPersonID)

Sie können auch explizit die FOREIGN KEY-Klausel verwenden und das Spaltenattribut nochmals nennen. Beachten Sie, dass der Spaltenname in den beiden Tabellen nicht identisch sein muss.

FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)

Einschränkungen für mehrspaltige Schlüssel werden als Tabelleneinschränkungen erstellt. Die SpecialOfferProduct-Tabelle in der AdventureWorks2012 -Datenbank enthält einen mehrspaltigen Primärschlüssel. Das folgende Beispiel zeigt, wie von einer anderen Tabelle aus auf diesen Schlüssel verwiesen wird; die Angabe eines expliziten Einschränkungsnamens ist optional.

CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail FOREIGN KEY
 (ProductID, SpecialOfferID)
REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)

C.Verwenden von UNIQUE-Einschränkungen

UNIQUE-Einschränkungen werden verwendet, um Eindeutigkeit für Nicht-Primärschlüsselspalten zu erzwingen. Im folgenden Beispiel wird eine Einschränkung erzwungen, durch die festgelegt wird, dass die Name-Spalte der Product-Tabelle eindeutig sein muss.

Name nvarchar(100) NOT NULL
UNIQUE NONCLUSTERED

D.Verwenden von DEFAULT-Definitionen

Standardwerte stellen jeweils einen Wert bereit (in INSERT- und UPDATE-Anweisungen), wenn kein Wert angegeben ist. Die AdventureWorks2012 -Datenbank könnte beispielsweise eine Nachschlagetabelle enthalten, in der die verschiedenen Tätigkeiten aufgelistet sind, die Mitarbeiter in dem Unternehmen ausüben können. In einer Spalte, in der jede Tätigkeit beschrieben wird, könnte ein Zeichenfolgen-Standardwert eine Beschreibung bereitstellen, falls keine explizite Angabe einer Beschreibung erfolgt.

DEFAULT 'New Position - title not formalized yet'

Neben Konstanten können DEFAULT-Definitionen auch Funktionen enthalten. Verwenden Sie das folgende Beispiel, um das aktuelle Datum für einen Eintrag zu erhalten.

DEFAULT (getdate())

Eine Funktion ohne Argumente kann ebenfalls zur Verbesserung der Datenintegrität beitragen. Verwenden Sie die Funktion ohne Argumente für USER, um den Benutzer nachzuverfolgen, der eine Zeile einfügt. Schließen Sie die Funktionen ohne Argumente nicht in Klammern ein.

DEFAULT USER

E.Verwenden von CHECK-Einschränkungen

Im folgenden Beispiel wird eine Einschränkung gezeigt, die für Werte gilt, die in die CreditRating-Spalte der Vendor-Tabelle eingegeben werden. Die Einschränkung ist nicht benannt.

CHECK (CreditRating >= 1 and CreditRating <= 5)

Dieses Beispiel zeigt eine benannte Einschränkung mit Mustereinschränkung für die Zeichendaten, die in eine Spalte einer Tabelle eingegeben werden.

CONSTRAINT CK_emp_id CHECK (emp_id LIKE 
'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' 
OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')

Dieses Beispiel gibt an, dass die Werte in einer speziellen Liste enthalten sein müssen oder einem bestimmten Muster entsprechen müssen.

CHECK (emp_id IN ('1389', '0736', '0877', '1622', '1756')
OR emp_id LIKE '99[0-9][0-9]')

F.Anzeigen der vollständigen Tabellendefinition

Im folgenden Beispiel werden die vollständigen Tabellendefinitionen mit allen Einschränkungsdefinitionen für die in der AdventureWorks2012 -Datenbank erstellte PurchaseOrderDetail-Tabelle angezeigt. Beachten Sie, dass zum Ausführen des Beispiels das Tabellenschema nach dbo geändert wird.

CREATE TABLE dbo.PurchaseOrderDetail
(
    PurchaseOrderID int NOT NULL
        REFERENCES Purchasing.PurchaseOrderHeader(PurchaseOrderID),
    LineNumber smallint NOT NULL,
    ProductID int NULL 
        REFERENCES Production.Product(ProductID),
    UnitPrice money NULL,
    OrderQty smallint NULL,
    ReceivedQty float NULL,
    RejectedQty float NULL,
    DueDate datetime NULL,
    rowguid uniqueidentifier ROWGUIDCOL  NOT NULL
        CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (newid()),
    ModifiedDate datetime NOT NULL 
        CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate DEFAULT (getdate()),
    LineTotal  AS ((UnitPrice*OrderQty)),
    StockedQty  AS ((ReceivedQty-RejectedQty)),
    CONSTRAINT PK_PurchaseOrderDetail_PurchaseOrderID_LineNumber
               PRIMARY KEY CLUSTERED (PurchaseOrderID, LineNumber)
               WITH (IGNORE_DUP_KEY = OFF)
) 
ON PRIMARY;

G.Erstellen einer Tabelle mit einer XML-Spalte, die mit einer XML-Schemaauflistung typisiert wird

Im folgenden Beispiel wird eine Tabelle mit einer xml-Spalte erstellt, die mit der XML-Schemaauflistung HRResumeSchemaCollection typisiert wird. Das DOCUMENT-Schlüsselwort gibt an, dass jede Instanz des xml-Datentyps in column_name nur ein Element der obersten Ebene enthalten kann.

USE AdventureWorks2012;
GO
CREATE TABLE HumanResources.EmployeeResumes 
   (LName nvarchar(25), FName nvarchar(25), 
    Resume xml( DOCUMENT HumanResources.HRResumeSchemaCollection) );

H.Erstellen einer partitionierten Tabelle

Im folgenden Beispiel wird eine Partitionsfunktion zum Partitionieren einer Tabelle oder eines Indexes in vier Partitionen erstellt. Anschließend wird im Beispiel ein Partitionsschema erstellt, das die Dateigruppen angibt, die jede der vier Partitionen aufnehmen sollen. Schließlich wird eine Tabelle erstellt, die das Partitionsschema verwendet. Bei diesem Beispiel wird vorausgesetzt, dass die Dateigruppen bereits in der Datenbank vorhanden sind.

CREATE PARTITION FUNCTION myRangePF1 (int)
    AS RANGE LEFT FOR VALUES (1, 100, 1000) ;
GO

CREATE PARTITION SCHEME myRangePS1
    AS PARTITION myRangePF1
    TO (test1fg, test2fg, test3fg, test4fg) ;
GO

CREATE TABLE PartitionTable (col1 int, col2 char(10))
    ON myRangePS1 (col1) ;
GO

Basierend auf den Werten der col1-Spalte von PartitionTable werden die Partitionen folgendermaßen zugewiesen.

Dateigruppe

test1fg

test2fg

test3fg

test4fg

Partition

1

2

3

4

Werte

col1 <= 1

col1 > 1 AND col1 <= 100

col1 > 100 AND col1 <= 1,000

col1 > 1000

I.Verwenden des uniqueidentifier-Datentyps in einer Spalte

Im folgenden Beispiel wird eine Tabelle mit einer uniqueidentifier-Spalte erstellt. In dem Beispiel wird eine PRIMARY KEY-Einschränkung verwendet, um zu verhindern, dass Benutzer doppelte Werte in die Tabelle einfügen. Mithilfe der NEWSEQUENTIALID()-Funktion in der DEFAULT-Einschränkung werden Werte für neue Zeilen bereitgestellt. Die ROWGUIDCOL-Eigenschaft wird auf die uniqueidentifier-Spalte angewendet, sodass mit dem $ROWGUID-Schlüsselwort auf sie verwiesen werden kann.

CREATE TABLE dbo.Globally_Unique_Data
    (guid uniqueidentifier CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
    Employee_Name varchar(60)
    CONSTRAINT Guid_PK PRIMARY KEY (guid) );

J.Verwenden eines Ausdrucks für eine berechnete Spalte

Im folgenden Beispiel wird die Verwendung eines Ausdrucks ((low + high)/2) zum Berechnen der berechneten Spalte myavg verwendet.

CREATE TABLE dbo.mytable 
    ( low int, high int, myavg AS (low + high)/2 ) ;

K.Erstellen einer berechneten Spalte basierend auf einer Spalte eines benutzerdefinierten Typs

Im folgenden Beispiel wird eine Tabelle mit einer Spalte erstellt, die als Spalte des benutzerdefinierten Typs utf8string definiert ist. Hierbei wird vorausgesetzt, dass die Assembly des Typs und der Typ selbst bereits in der aktuellen Datenbank erstellt wurden. Eine zweite Spalte wird basierend auf utf8string definiert. Hierbei wird die ToString()-Methode des/der type(class) utf8string Typ(Klasse) verwendet, um einen Wert für die Spalte zu berechnen.

CREATE TABLE UDTypeTable 
    ( u utf8string, ustr AS u.ToString() PERSISTED ) ;

L.Verwenden der USER_NAME-Funktion für eine berechnete Spalte

Im folgenden Beispiel wird die USER_NAME()-Funktion in der myuser_name-Spalte verwendet.

CREATE TABLE dbo.mylogintable
    ( date_in datetime, user_id int, myuser_name AS USER_NAME() ) ;

M.Erstellen einer Tabelle mit einer FILESTREAM-Spalte

Im folgenden Beispiel wird eine Tabelle mit der FILESTREAM-Spalte Photo erstellt. Eine Tabelle mit einer oder mehreren FILESTREAM-Spalten muss eine ROWGUIDCOL-Spalte enthalten.

CREATE TABLE dbo.EmployeePhoto
    (
    EmployeeId int NOT NULL PRIMARY KEY
    ,Photo varbinary(max) FILESTREAM NULL
    ,MyRowGuidColumn uniqueidentifier NOT NULL ROWGUIDCOL
        UNIQUE DEFAULT NEWID()
    );

N.Erstellen einer Tabelle, in der Zeilenkomprimierung verwendet wird

Im folgenden Beispiel wird eine Tabelle erstellt, in der Zeilenkomprimierung verwendet wird.

CREATE TABLE dbo.T1 
(c1 int, c2 nvarchar(200) )
WITH (DATA_COMPRESSION = ROW);

Weitere Beispiele zur Datenkomprimierung finden Sie unter Datenkomprimierung.

O.Erstellen einer Tabelle mit Spalten mit geringer Dichte und einem Spaltensatz

Anhand der folgenden Beispiele wird gezeigt, wie Sie eine Tabelle mit einer Spalte mit geringer Dichte und eine Tabelle mit zwei Spalten mit geringer Dichte und einem Spaltensatz erstellen. In den Beispielen wird die grundlegende Syntax verwendet. Komplexere Beispiele finden Sie unter Verwenden von Spalten mit geringer Dichte und Verwenden von Spaltensätzen.

In diesem Beispiel wird eine Tabelle erstellt, die eine Spalte mit geringer Dichte enthält.

CREATE TABLE dbo.T1
    (c1 int PRIMARY KEY,
    c2 varchar(50) SPARSE NULL ) ;

In diesem Beispiel wird eine Tabelle erstellt, die zwei Spalten mit geringer Dichte und einen Spaltensatz mit dem Namen CSet enthält.

CREATE TABLE T1
    (c1 int PRIMARY KEY,
    c2 varchar(50) SPARSE NULL,
    c3 int SPARSE NULL,
    CSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ) ;

Siehe auch

Verweis

ALTER TABLE (Transact-SQL)

COLUMNPROPERTY (Transact-SQL)

CREATE INDEX (Transact-SQL)

CREATE VIEW (Transact-SQL)

Datentypen (Transact-SQL)

DROP INDEX (Transact-SQL)

sys.dm_sql_referenced_entities (Transact-SQL)

sys.dm_sql_referencing_entities (Transact-SQL)

DROP TABLE (Transact-SQL)

CREATE PARTITION FUNCTION (Transact-SQL)

CREATE PARTITION SCHEME (Transact-SQL)

CREATE TYPE (Transact-SQL)

EVENTDATA (Transact-SQL)

sp_help (Transact-SQL)

sp_helpconstraint (Transact-SQL)

sp_rename (Transact-SQL)

sp_spaceused (Transact-SQL)