Verwenden von besonderen Daten
Bei besonderen Datentypen handelt es sich um solche Datentypen, die keinen anderen Datentypkategorien zugeordnet werden können. Wenn beispielsweise Daten als 1 oder 0 (entsprechend der Angabe für Ja oder Nein in einer Kundenumfrage) gespeichert werden sollen, verwenden Sie den bit-Datentyp. Microsoft SQL Server 2005 weist mehrere Datentypen auf, die in diese Kategorie gehören:
bit
bit-Daten müssen nicht in einfache Anführungszeichen eingeschlossen werden. Hierbei handelt es sich um numerische Daten, die den numerischen Daten und ganzzahligen Daten von SQL Server ähneln, mit der Ausnahme, dass nur 0 und 1 in bit-Spalten gespeichert werden können.Die Zeichenfolgenwerte True und False können wie nachstehend gezeigt in bit-Werte konvertiert werden.
SELECT CONVERT (bit, 'true'), CONVERT(bit, 'false')
True wird zu 1 konvertiert, False zu 0.
sql_variant
Der sql_variant-Datentyp in SQL Server ermöglicht es einer einzelnen Spalte, einem Parameter oder einer Variablen, Datenwerte verschiedener Datentypen zu speichern. Jede Instanz einer sql_variant-Spalte zeichnet den Datenwert und die Metadaten auf, die den Wert beschreiben: Basisdatentyp, maximale Größe, Dezimalstellen, Genauigkeit und Sortierung.Die zweite Tabelle im folgenden Beispiel enthält eine sql_variant-Spalte:
CREATE TABLE ObjectTable (ObjectID int CONSTRAINT PKObjectTable PRIMARY KEY, ObjectName nvarchar(80), ObjectWeight decimal(10,3), ObjectColor nvarchar(20)) CREATE TABLE VariablePropertyTable (ObjectID int REFERENCES ObjectTable(ObjectID), PropertyName nvarchar(100), PropertyValue sql_variant, CONSTRAINT PKVariablePropertyTable PRIMARY KEY(ObjectID, PropertyName))
Zum Abrufen der Metadateninformationen für eine bestimmte sql_variant-Instanz steht Ihnen die SQL_VARIANT_PROPERTY-Funktion zur Verfügung.
sysname
Instanzen von SQL Server enthalten einen benutzerdefinierten Datentyp namens sysname. sysname wird für Tabellenspalten, Variablen und Parameter gespeicherter Prozeduren verwendet, die Objektnamen speichern. Die genaue Definition von sysname ist mit den Regeln für Bezeichner verbunden und kann folglich je nach Instanz von SQL Server varrieren. sysname ist vom funktionellen Standpunkt gleichwertig mit nvarchar(128). Von SQL Server Version 6.5 oder früher werden nur kleinere Bezeichner unterstützt; folglich wurde sysname in früheren Versionen als varchar(30) definiert.Wichtig: In Datenbanken, bei denen zwischen Groß-/Kleinschreibung unterschieden wird bzw. die eine binäre Sortierung aufweisen, wird sysname nur bei Kleinschreibung als Systemdatentyp von SQL Server erkannt.
table
Der table-Datentyp ist vergleichbar mit temporären Tabellen und kann zum Speichern eines Resultsets für die spätere Verarbeitung verwendet werden. Dieser Datentyp kann nur zur Definition lokaler Variablen des table-Datentyps und des Rückgabewertes einer benutzerdefinierten Funktion verwendet werden.Die Definition einer Tabellenvariablen oder eines Rückgabewerts umfasst Definitionen der Spalten, den Datentyp, die Genauigkeit und Dezimalstellenanzahl jeder Spalte sowie optional PRIMARY KEY-, UNIQUE-, NULL- und CHECK-Einschränkungen. Ein benutzerdefinierter Datentyp kann nicht als Datentyp verwendet werden.
Das in einer table-Variablen gespeicherte oder von einer benutzerdefinierten Funktion zurückgegebene Zeilenformat muss beim Deklarieren der Variablen oder beim Erstellen der Funktion definiert werden. Die Syntax basiert auf der CREATE TABLE-Syntax. Beispiel:
DECLARE @TableVar TABLE (Cola int PRIMARY KEY, Colb char(3)) INSERT INTO @TableVar VALUES (1, 'abc') INSERT INTO @TableVar VALUES (2, 'def') SELECT * FROM @TableVar GO
table-Variablen und benutzerdefinierte Funktionen, die table zurückgeben, können nur in bestimmten SELECT- und INSERT-Anweisungen und sofern Tabellen in den UPDATE-, DELETE- und DECLARE CURSOR-Anweisungen unterstützt werden, verwendet werden. table-Variablen und benutzerdefinierte Funktionen, die table zurückgeben, können in keinen anderen Transact-SQL-Anweisungen verwendet werden.
Indizes oder sonstige Einschränkungen auf die Tabelle müssen im Rahmen der DECLARE-Variablen oder der CREATE FUNCTION-Anweisung definiert werden. Sie können nicht nachträglich angewendet werden, da CREATE INDEX- oder ALTER TABLE-Anweisungen nicht auf Tabellenvariablen und benutzerdefinierte Funktionen verweisen können.
Weitere Informationen zur Syntax für die Definition der table-Variablen und benutzerdefinierten Funktionen finden Sie unter DECLARE @local\_variable (Transact-SQL) und CREATE FUNCTION (Transact-SQL).
timestamp
Der SQL Server timestamp-Datentyp hat nichts mit Uhrzeit- oder Datumsangaben zu tun. SQL Server timestamp-Werte sind binäre Zahlen, die die relative Reihenfolge anzeigen, in der Datenänderungen in einer Datenbank vorgenommen wurden. Der timestamp-Datentyp wurde ursprünglich zur Unterstützung des SQL Server-Wiederherstellungsalgorithmus implementiert. Jedes Mal, wenn eine Seite geändert wurde, wurde sie mit dem aktuellen @@DBTS-Wert markiert; @@DBTS wurde dann um eins erhöht. Dies reichte aus, damit die Wiederherstellung die relative Reihenfolge ermitteln konnte, in der Seiten geändert wurden. Allerdings hingen die timestamp-Werte nicht mit der Zeit zusammen.In SQL Server, Version 7.0, und SQL Server 2000 wird @@DBTS nur für die Verwendung in timestamp-Spalten erhöht. Enthält eine Tabelle eine timestamp-Spalte wird bei jeder Änderung einer Zeile durch eine INSERT-, UPDATE- oder DELETE-Anweisung der timestamp-Wert in der Zeile auf den aktuellen @@DBTS-Wert festgelegt und @@DBTS dann um eins erhöht.
timestamp-Spalten dürfen nie in Schlüsseln, vor allem Primärschlüsseln, verwendet werden, da der timestamp-Wert bei jedem Ändern der Zeile geändert wird.
Zum Aufzeichnen der Zeiten, zu denen Datenänderungen in einer Tabelle stattfinden, verwenden Sie entweder den datetime- oder den smalldatetime-Datentyp, um die Ereignisse und Trigger aufzuzeichnen, die die Werte bei Änderungen automatisch aktualisieren.
Aliasdatentypen
Aliasdatentypen ermöglichen Ihnen die Erweiterung eines SQL Server-Basisdatentyps (z. B. varcha) um einen beschreibenden Namen und ein Format, das auf einen bestimmten Verwendungszweck zugeschnitten ist. Die folgende Anweisung implementiert beispielsweise mithilfe des datetime-Basisdatentyps den benutzerdefinierten birthday-Datentyp, der NULL-Werte zulässt:EXEC sp_addtype birthday, datetime, 'NULL'
Gehen Sie bei der Auswahl der Basistypen zum Implementieren benutzerdefinierter Datentypen sorgfältig vor. Sozialversicherungsnummern in den USA weisen beispielsweise das Format nnn-nn-nnnn auf. Die Sozialversicherungsnummern enthalten zwar Zahlen, bilden jedoch einen Bezeichner und werden keinen mathematischen Operationen unterzogen. Als gängige Regel wird deshalb der benutzerdefinierte Datentyp varchar für Sozialversicherungsnummern und eine CHECK-Einschränkung erstellt, um das Format der in der Tabelle gespeicherten Sozialversicherungsnummern zu erzwingen:
EXEC sp_addtype SSN, 'VARCHAR(11)', 'NOT NULL' GO CREATE TABLE ShowSSNUsage (EmployeeID int PRIMARY KEY, EmployeeSSN SSN, CONSTRAINT CheckSSN CHECK ( EmployeeSSN LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' ) ) GO
Wenn die SSN-Spalten in der Regel als Schlüsselspalten in Indizes, vor allem gruppierte Indizes, verwendet werden, kann die Größe der Schlüssel von 11 Byte auf 4 Byte reduziert werden, wenn anstelle dessen der benutzerdefinierte SSN-Datentyp mithilfe des int-Basisdatentyps implementiert wird. Durch diese Reduzierung der Schlüsselgröße wird der Datenabruf verbessert. Die gesteigerte Effizienz beim Datenabruf und das Wegfallen der CHECK-Einschränkung machen in der Regel den zusätzlichen Konvertierungsaufwand von int in ein Zeichenformat beim Anzeigen oder Ändern von SSN-Werten wett.
Siehe auch
Andere Ressourcen
CREATE FUNCTION (Transact-SQL)
Datentypen (Transact-SQL)
DECLARE @local\_variable (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)
table (Transact-SQL)