CREATE TABLE (Transact-SQL)
Erstellt eine neue Tabelle.
Syntax
CREATE TABLE
[ database_name . [ schema_name ] . | schema_name . ] table_name
( { <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 ] )
]
| [ 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 )
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
]
<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 ] ) ]
}
<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. Mit database_name muss der Name einer vorhandenen Datenbank angegeben werden. 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 darf maximal 128 Zeichen umfassen. Hiervon ausgenommen sind Namen lokaler temporärer Tabellen (Namen, die ein einzelnes Nummerzeichen (#) als Präfix haben); diese dürfen maximal 116 Zeichen umfassen.column_name
Der Name einer Spalte in der Tabelle. Spaltennamen müssen den Regeln für Bezeichner entsprechen und innerhalb der Tabelle eindeutig sein. column_name kann bis zu 128 Zeichen lang sein. column_name muss nicht für Spalten angegeben werden, die mit einem timestamp-Datentyp erstellt werden. 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 permanente 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:
Eine berechnete Spalte kann nicht als DEFAULT- oder FOREIGN KEY-Einschränkungsdefinition oder mit einer NOT NULL-Einschränkungsdefinition verwendet werden. Eine berechnete Spalte kann jedoch 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.
Hinweis 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 permanente Spalte markieren, können Sie einen Index für eine berechnete Spalte erstellen, die deterministisch, jedoch nicht genau ist. Weitere Informationen finden Sie unter Erstellen von Indizes für berechnete Spalten. Alle berechneten Spalten, die als Partitionierungsspalten einer partitionierten Tabelle verwendet werden, müssen explizit als permanent markiert werden. 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 {<partition_scheme> | 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.
Hinweis 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).
Hinweis 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" }
Schlüsselwörter, die anzeigen, dass die Spalten vom Typ text, ntext, image, xml, varchar(max), nvarchar(max) und varbinary(max) und eines CLR-benutzerdefinierten Typs 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.
Hinweis 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 Entwerfen und Implementieren der FILESTREAM-Speicherung.
[ 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 außer Kraft setzen. 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-, Aktualisierungs- oder Löschvorgänge ausführen. Weitere Informationen finden Sie unter Steuern von Einschränkungen, Identitäten und Triggern mithilfe von NOT FOR REPLICATION.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 zugegriffen werden. Die ROWGUIDCOL-Eigenschaft kann nur einer uniqueidentifier-Spalte zugewiesen werden. Das ROWGUIDCOL-Schlüsselwort ist nicht gültig, wenn der Kompatibilitätsgrad der Datenbank kleiner als oder gleich 65 ist. Weitere Informationen finden Sie unter sp_dbcmptlevel (Transact-SQL). 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 durch eine Anwendung bereitgestellt werden, wenn Daten eingefügt werden, oder durch eine DEFAULT-Einschränkung, die die NEWID ()-Funktion verwendet.
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 für Spalten der char-, varchar-, text-, nchar-, nvarchar- und ntext-Datentypen. 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. Weitere Informationen finden Sie unter Einschränkungen.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 permanent 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 AdventureWorks-Datenbank verfügt die ProductVendor-Tabelle z. B. über eine referenzielle Beziehung zu der Vendor-Tabelle. Der ProductVendor.VendorID-Fremdschlüssel verweist dabei auf den Vendor.VendorID-Primärschlüssel.
Wenn eine DELETE-Anweisung für eine Zeile in der Vendor-Tabelle ausgeführt wird und eine ON DELETE CASCADE-Aktion für ProductVendor.VendorID festgelegt ist, sucht Database Engine (Datenbankmodul) nach abhängigen Zeilen 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 kann nicht definiert werden, wenn für ON UPDATE bereits ein INSTEAD OF-Trigger für die geänderte Tabelle vorhanden ist.
In der AdventureWorks-Datenbank verfügt die ProductVendor-Tabelle z. B. über eine referenzielle Beziehung zur Vendor-Tabelle: Der Fremdschlüssel ProductVendor.VendorID verweist auf den Primärschlüssel Vendor.VendorID.
Wenn eine UPDATE-Anweisung für eine Zeile in der Vendor-Tabelle ausgeführt wird und eine ON UPDATE CASCADE-Aktion für ProductVendor.VendorID angegeben ist, sucht das Database Engine (Datenbankmodul) nach einer oder mehreren abhängigen Zeilen 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 Aktualisierungsaktion 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 werden. CHECK-Einschränkungen für berechnete Spalten müssen zudem (mit PERSISTED) als permanent 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.Wichtig 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. Weitere Informationen finden Sie unter Effizientes Übertragen von Daten durch Partitionswechsel.
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.Wichtig 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 Erstellen komprimierter Tabellen und Indizes.
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 Prozentwert an, der dem Füllfaktor entspricht. Dieser Faktor legt fest, wie weit Database Engine (Datenbankmodul) die Blattebene jeder Indexseite während der Indexerstellung oder -änderung auffüllen soll. fillfactor muss ein ganzzahliger Wert von 1 bis 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 Option IGNORE_DUP_KEY 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 und XML-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 ist die automatische Statistikaktualisierung 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. Das Database Engine (Datenbankmodul) bestimmt, wann Seitensperren verwendet werden. Bei der Einstellung OFF werden Seitensperren nicht verwendet. Die Standardeinstellung ist ON.
Hinweise
SQL Server 2008 unterstützt bis zu 2 Milliarden Tabellen pro Datenbank. Eine Tabelle mit einem definierten Spaltensatz kann bis zu 30.000 Spalten mit maximal 1.024 normalen (nicht mit geringer Dichte) + berechneten Spalten aufweisen. Tabellen, die keine Spaltensätze haben, sind auf 1.024 Spalten begrenzt. Die Anzahl der Zeilen je Tabelle und die Gesamtgröße der Tabelle sind nur durch den verfügbaren Speicherplatz begrenzt. Die maximale Anzahl von Bytes pro Zeile beträgt 8.060. Diese Einschränkung ist für Tabellen mit varchar-, nvarchar-, varbinary- oder sql_variant-Spalten gelockert, die bewirken, dass die definierte Gesamtbreite der Tabelle 8.060 Bytes überschreitet. Für die Länge jeder dieser Spalten gilt weiterhin die Grenze von 8.000 Bytes. Ihre gemeinsame Breite darf jedoch die innerhalb einer Tabelle geltende Grenze von 8.060 Bytes überschreiten. Weitere Informationen finden Sie unter Zeilenüberlauf bei Daten über 8 KB.
Jede Tabelle kann maximal 999 nicht gruppierte Indizes und 1 gruppierten Index enthalten. Dazu gehören die Indizes, die zur Unterstützung von für die Tabelle definierten PRIMARY KEY- und UNIQUE-Einschränkungen erstellt werden.
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 eine 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.
Es empfiehlt sich, Tabellenvariablen anstelle von temporären Tabellen zu verwenden. Temporäre Tabellen sind hilfreich, wenn Indizes explizit für diese Tabellen erstellt werden müssen oder wenn die Tabellenwerte in mehreren gespeicherten Prozeduren oder Funktionen sichtbar sein müssen. Im Allgemeinen tragen jedoch Tabellenvariablen zu einer effizienteren Abfrageverarbeitung bei. Weitere Informationen finden Sie unter table (Transact-SQL).
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.
Eine Spalte vom Typ varchar(max) kann nur dann in eine FOREIGN KEY-Einschränkung einbezogen werden, wenn der Primärschlüssel, auf den verwiesen wird, ebenfalls als varchar(max)-Typ definiert ist.
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 DBCC DBREINDEX neu erstellt werden.
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. Das Database Engine (Datenbankmodul) wählt die geeignete Sperre aus und kann die Sperre von einer Zeilen- auf eine Seiten- oder Tabellensperre ausweiten. Weitere Informationen finden Sie unter Sperrenausweitung (Datenbankmodul). Wenn ALLOW_ROW_LOCKS auf OFF und ALLOW_PAGE_LOCK auf OFF festgelegt ist, sind beim Zugriff auf den Index nur Sperren auf Tabellenebene zulässig. Weitere Informationen zum Konfigurieren der Sperrengranularität für einen Index finden Sie unter Anpassen der Sperren für einen Index.
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 außer Kraft gesetzt. 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 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.
Hinweis |
---|
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 Erstellen komprimierter Tabellen und Indizes.
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.
Beispiele
A. Verwenden von PRIMARY KEY-Einschränkungen
Dieses Beispiel zeigt die Spaltendefinition für eine PRIMARY KEY-Einschränkung mit einem gruppierten Index für die EmployeeID-Spalte der Employee-Tabelle (wobei der Einschränkungsname vom System bereitgestellt wird) in der AdventureWorks-Beispieldatenbank.
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 AdventureWorks-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 AdventureWorks-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 AdventureWorks-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 AdventureWorks;
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 T1
(c1 int, c2 nvarchar(200) )
WITH (DATA_COMPRESSION = ROW);
Weitere Beispiele zur Datenkomprimierung finden Sie unter Erstellen komprimierter Tabellen und Indizes.
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.
Führen Sie den folgenden Code aus, um eine Tabelle zu erstellen, die eine Spalte mit geringer Dichte aufweist.
CREATE TABLE T1
(c1 int PRIMARY KEY,
C2 varchar(50) SPARSE NULL ) ;
Führen Sie den folgenden Code aus, um eine Tabelle zu erstellen, die zwei Spalten mit geringer Dichte und einen Spaltensatz mit dem Namen CSet aufweist.
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