CREATE TABLE (Transact-SQL)
Aktualisiert: 12. Dezember 2006
Erstellt eine neue Tabelle.
Transact-SQL-Syntaxkonventionen
Syntax
CREATE TABLE
[ database_name . [ schema_name ] . | schema_name . ] table_name
( { <column_definition> | <computed_column_definition> }
[ <table_constraint> ] [ ,...n ] )
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| "default" } ]
[ { TEXTIMAGE_ON { filegroup | "default" } ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ 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 )
]
< 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 )
}
<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}
}
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 1 bis 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 physikalisch 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 vom SQL Server 2005-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.
- 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.
- PERSISTED
Gibt an, dass das SQL Server-Datenbankmodul die berechneten Werte physikalisch 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).
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).
[ 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 von SQL Server 2005.
- 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-Datenbankmodul auf type_name in der folgenden Reihenfolge:
- Der 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 zu gültigen Genauigkeitswerten 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 und dient dazu, dem Typ eine XML-Schemaauflistung zuzuordnen. 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 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 Spalten vom Typ tinyint, smallint, int, bigint, decimal(p,0) oder numeric(p,0) 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.
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. Bei FOREIGN KEY-Einschränkungen ist es erforderlich, dass jeder Wert in der Spalte in der oder den entsprechenden Spalten in der Tabelle, auf die verwiesen wird, vorhanden ist. FOREIGN KEY-Einschränkungen können nur auf zwei Arten von Spalten verweisen: auf Spalten, die ihrerseits PRIMARY KEY- oder UNIQUE-Einschränkungen in der Tabelle, auf die verwiesen wird, darstellen, oder auf Spalten, auf die eine UNIQUE INDEX-Einschränkung für die Tabelle verweist, auf die 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
Das Datenbankmodul löst einen Fehler aus, und für die Löschaktion der Zeile in der übergeordneten Tabelle wird ein Rollback ausgeführt.
- CASCADE
Entsprechende Zeilen werden aus der verweisenden Tabelle gelöscht, wenn diese Zeile aus der übergeordneten Tabelle gelöscht wird.
- 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 kein expliziter Standardwert festgelegt wurde, wird NULL der implizite Standardwert der Spalte.
Geben Sie CASCADE nicht an, wenn die Tabelle in eine Mergepublikation 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 Fremdschlüssel ProductVendor.VendorID verweist auf den Primärschlüssel Vendor.VendorID.
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 angegeben ist, sucht das 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, gelöscht.
Wenn jedoch NO ACTION angegeben ist, löst das 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.
- NO ACTION
ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
Gibt an, welche Aktion für Zeilen in der geänderten Tabelle ausgeführt werden soll, wenn diese Zeilen eine referenzielle Beziehung aufweisen und die Zeile, auf die verwiesen wird, in der übergeordneten Tabelle aktualisiert wird. Der Standardwert ist NO ACTION.- NO ACTION
Das Datenbankmodul löst einen Fehler aus, und für die Aktualisierungsaktion für die Zeile in der übergeordneten Tabelle wird ein Rollback ausgeführt.
- CASCADE
Entsprechende Zeilen in der verweisenden Tabelle werden aktualisiert, wenn diese Zeile in der übergeordneten Tabelle aktualisiert wird.
- 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. 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 aktualisiert 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 kein expliziter Standardwert festgelegt wurde, wird NULL der implizite Standardwert der Spalte.
Geben Sie CASCADE nicht an, wenn die Tabelle in eine Mergepublikation 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 Tabelle vorhanden ist, die geändert wird.
In der AdventureWorks-Datenbank verfügt die ProductVendor-Tabelle z. B. über eine referenzielle Beziehung zu der 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 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 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.
- NO ACTION
- 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 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. Eine berechnete Spalte, die an einer Partitionsfunktion beteiligt ist, muss explizit (mit PERSISTED) als permanent markiert 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 Datenbankmodul die einzelnen Indexseiten füllen soll, die zum Speichern der Indexdaten verwendet werden. Benutzer können fillfactor-Werte von 1 bis 100 angeben. 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.
- <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 die Datenbankmodul die Blattebene jeder Indexseite während der Indexerstellung oder -änderung auffüllen soll. fillfactor muss ein ganzzahliger Wert zwischen 1 und 100 sein. Der Standardwert lautet 0. Die Füllfaktorwerte 0 und 100 sind in jeder Hinsicht identisch.
- IGNORE_DUP_KEY = { ON | OFF }
Gibt die Fehlerreaktion bei doppelten Schlüsselwerten in einer mehrzeiligen INSERT-Transaktion für einen eindeutigen gruppierten oder eindeutigen nicht gruppierten Index an. Falls der Parameter auf ON festgelegt ist und eine Zeile die Eindeutigkeit des Indexes verletzt, wird eine Warnmeldung ausgegeben, und der Vorgang schlägt lediglich für die Zeilen fehl, die die UNIQUE-Einschränkung des Indexes verletzen. Wenn der Parameter auf OFF festgelegt ist und eine Zeile die Eindeutigkeit des Indexes verletzt, wird eine Fehlermeldung ausgegeben, und für die ganze INSERT-Transaktion wird ein Rollback ausgeführt. Bei der Ausführung einer UPDATE-Anweisung hat IGNORE_DUP_KEY keine Wirkung. Die Standardeinstellung ist OFF.
- 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 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 Datenbankmodul bestimmt, wann Seitensperren verwendet werden. Bei der Einstellung OFF werden Seitensperren nicht verwendet. Die Standardeinstellung ist ON.
Hinweise
SQL Server 2005 unterstützt bis zu 2 Milliarden Tabellen pro Datenbank und 1.024 Spalten pro Tabelle. 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 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 249 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 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 Datenbankmodul möglich sein, die von den verschiedenen Benutzern erstellten Tabellen zu unterscheiden. Zu diesem Zweck fügt das 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.
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 mithilfe von CREATE PARTITION FUNCTION (Transact-SQL) 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 mithilfe von CREATE PARTITION SCHEME (Transact-SQL) 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 249 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 CLR User-Defined Types.
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 249 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 CLR User-Defined Types.
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 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 Datenbankmodul nach der möglichen Angabe von NO ACTION sucht.
- Das 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 CLR User-Defined Types.
- 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 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. Um einen Bericht über die Sichten und gespeicherten Prozeduren zu erhalten, die von einer Tabelle abhängig sind, verwenden Sie sp_depends.
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.
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 Datenbankmodul verwendet die NULL-Zulässigkeit, die beim Erstellen des Datentyps angegeben wurde. Zum Bestimmen der standardmäßige 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 der Kompatibilitätsgrad kleiner oder gleich 65 ist, wird für bit-Datentypen standardmäßig NOT NULL verwendet, wenn nicht explizit NULL oder NOT NULL für die Spalte definiert wurde. Weitere Informationen finden Sie unter sp_dbcmptlevel (Transact-SQL). 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 SQL Server-Standardwert NOT NULL zugewiesen.
Wenn es sich bei der Spalte um eine berechnete Spalte handelt, wird die NULL-Zulässigkeit stets automatisch durch das 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. |
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 die Spalte zugegriffen 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() ) ;
Siehe auch
Verweis
ALTER TABLE (Transact-SQL)
COLUMNPROPERTY (Transact-SQL)
CREATE INDEX (Transact-SQL)
CREATE RULE (Transact-SQL)
CREATE VIEW (Transact-SQL)
Datentypen (Transact-SQL)
DROP INDEX (Transact-SQL)
DROP RULE (Transact-SQL)
DROP TABLE (Transact-SQL)
CREATE PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL)
CREATE TYPE (Transact-SQL)
EVENTDATA (Transact-SQL)
sp_depends (Transact-SQL)
sp_help (Transact-SQL)
sp_helpconstraint (Transact-SQL)
sp_rename (Transact-SQL)
sp_spaceused (Transact-SQL)
Hilfe und Informationen
Informationsquellen für SQL Server 2005
Änderungsverlauf
Version | Verlauf |
---|---|
12. Dezember 2006 |
|
14. April 2006 |
|