Arbeiten mit Datentypen
In Transact-SQL verwendete Spalten und Variablen haben jeweils einen Datentyp. Das Verhalten von Werten in Ausdrücken ist abhängig vom Datentyp der Spalte oder der Variablen, auf die verwiesen wird. Wie Sie zuvor gesehen haben, können Sie beispielsweise mithilfe des Operators + zwei Zeichenfolgenwerte verketten oder zwei numerische Werte hinzufügen.
Die folgende Tabelle zeigt allgemeine Datentypen, die in einer SQL Server-Datenbank unterstützt werden.
Exakter numerischer Wert
Ungefährer numerischer Wert
Zeichen
Date/Time
Binary
Sonstiges
TINYINT
float
char
date
BINARY
cursor
SMALLINT
real
varchar
time
varbinary
hierarchyid
INT
text
datetime
image
sql_variant
BIGINT
NCHAR
datetime2
table
bit
NVARCHAR
smalldatetime
timestamp
decimal/numeric
ntext
datetimeoffset
UNIQUEIDENTIFIER
NUMERIC
Xml
money
geography
SMALLMONEY
Geometrie
Hinweis
Weitere Informationen zu den verschiedenen Datentypen und ihren Attributen finden Sie in der Referenzdokumentation zu Transact-SQL.
Datentypkonvertierung
Werte kompatibler Datentypen können bei Bedarf implizit konvertiert werden. Angenommen beispielsweise, Sie können mithilfe des Operators + einer + eine ganzzahlige Zahl hinzufügen oder einen char-Wert fester Länge und einen varchar-Wert variabler Länge miteinander verketten. In einigen Fällen müssen Sie Werte jedoch möglicherweise aus einem Datentyp explizit in einen anderen konvertieren. So führt z. B. der Versuch, einen varchar-Wert mithilfe von + mit einem decimalWert (Dezimalwert) zu verketten, zu einem Fehler – sofern Sie nicht zuerst den numerischen Wert in einen kompatiblen Zeichenfolgendatentyp konvertieren.
Hinweis
Implizite und explizite Konvertierungen gelten für bestimmte Datentypen, und einige Konvertierungen sind nicht möglich. Weitere Informationen finden Sie in dem Diagramm in der Referenzdokumentation zu Transact-SQL.
T-SQL enthält Funktionen, die Sie bei der expliziten Konvertierung zwischen Datentypen unterstützen sollen:
„CAST“ und „TRY_CAST“
Die Funktion „CAST“ konvertiert einen Wert in einen angegebenen Datentyp, wenn der Wert mit dem Zieldatentyp kompatibel ist. Bei Inkompatibilität wird ein Fehler zurückgegeben.
Die folgende Abfrage verwendet beispielsweise „CAST“ zum Konvertieren der ganzzahligen Werte in der Spalte ProductID in varchar-Werte (mit maximal 4 Zeichen), um sie mit einem anderen zeichenbasierten Wert zu verketten:
SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;
Das mögliche Ergebnis dieser Abfrage könnte ungefähr so aussehen:
ProductName
680: HL Road Frame – Black, 58
706: HL Road Frame – Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
Nehmen wir jedoch an, dass die Spalte Size in der Tabelle Production.Product eine Spalte vom Typ nvarchar (variable Länge, Unicode-Textdaten) ist, die einige numerische Größen (z. B. „58“) und einige textbasierte Größen (z. B. „S“, „M“ oder „L“) enthält. Die folgende Abfrage versucht, Werte aus dieser Spalte in einen ganzzahligen Datentyp zu konvertieren:
SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;
Diese Abfrage führt zu folgender Fehlermeldung:
Fehler: „Fehler beim Konvertieren des nvarchar-Werts ‚M‘ in den Datentyp ‚int‘.“
Da mindestens einige der Werte in der Spalte numerisch sind, möchten Sie diese Werte möglicherweise konvertieren und die anderen ignorieren. Sie können Datentypen mithilfe der „TRY_CAST“-Funktion konvertieren.
SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;
Die Ergebnisse könnten jetzt so aussehen:
NumericSize
58
58
NULL
NULL
...
Die Werte, die in einen numerischen Datentyp konvertiert werden können, werden als Dezimalwerte zurückgegeben, und die inkompatiblen Werte werden als NULL zurückgegeben. Auf diese Weise wird angegeben, dass ein Wert unbekannt ist.
Hinweis
Später in dieser Lerneinheit werden Sie Überlegungen zur Behandlung von NULL-Werten erkunden.
CONVERT und TRY_CONVERT
„CAST“ ist die SQL-Funktion (nach ANSI-Standard) zum Konvertieren zwischen Datentypen und wird in vielen Datenbanksystemen verwendet. In Transact-SQL können Sie auch die Funktion „CONVERT“ verwenden, wie hier gezeigt wird:
SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;
Erneut gibt diese Abfrage den in den angegebenen Datentyp konvertierten Wert wie den folgenden zurück:
ProductName
680: HL Road Frame – Black, 58
706: HL Road Frame – Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
Wie „CAST“ umfasst „CONVERT“ eine „TRY_CONVERT“-Variante, die bei inkompatiblen Werten NULL zurückgibt.
Ein weiterer Vorteil der Verwendung von CONVERT gegenüber CAST ist, dass CONVERT einen Parameter enthält, mit dem Sie beim Konvertieren von numerischen Werten und Datumswerten in Zeichenfolgen einen Formatstil („style“) angeben können. Betrachten Sie beispielsweise die folgende Abfrage:
SELECT SellStartDate,
CONVERT(varchar(20), SellStartDate) AS StartDate,
CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate
FROM SalesLT.Product;
Die Ergebnisse dieser Abfrage könnten ungefähr so aussehen:
SellStartDate
StartDate
FormattedStartDate
01.06.2002T00:00:00.0000000
1. Juni 2002 12:00AM
01.06.2002
01.06.2002T00:00:00.0000000
1. Juni 2002 12:00AM
01.06.2002
01.07.2005T00:00:00.0000000
1. Juli 2005 12:00AM
1.7.2005
01.07.2005T00:00:00.0000000
1. Juli 2005 12:00AM
1.7.2005
...
...
...
Hinweis
Weitere Informationen zu style-Formatierungscodes, die Sie bei CONVERT verwenden können, finden Sie in der Referenzdokumentation zu Transact-SQL.
„PARSE“ und „TRY_PARSE“
Die Funktion „PARSE“ ist zum Konvertieren von formatierten Zeichenfolgen konzipiert, die numerische Werte oder Datums-/Uhrzeitwerte darstellen. Sehen Sie sich beispielsweise die folgende Abfrage an (die Literalwerte statt Werten aus Spalten in einer Tabelle verwendet):
SELECT PARSE('01/01/2021' AS date) AS DateValue,
PARSE('$199.99' AS money) AS MoneyValue;
Die Ergebnisse dieser Abfrage sehen so aus:
DatWert
MoneyValue
01.01.2021T00:00:00.0000000
199,99
Ähnlich wie bei „CAST“ und „CONVERT“ gibt es bei „PARSE“ eine „TRY_PARSE“-Variante, die inkompatible Werte als NULLzurückgibt.
Hinweis
Wenn Sie mit dezimalen oder numerischen Datentypen arbeiten, müssen Sie möglicherweise auf eine ganze Zahl runden oder das Dezimaltrennzeichen festlegen, was Sie über Genauigkeit (precision) und Skalierung (scale) erreichen. Informationen, um dieses Konzept der Genauigkeit und Skalierung besser zu verstehen, finden Sie in der Referenzdokumentation zu Transact-SQL.
STR
Die Funktion „STR“ konvertiert einen numerischen Wert in einen varchar-Wert.
Beispiel:
SELECT ProductID, '$' + STR(ListPrice) AS Price
FROM Production.Product;
Die Ergebnisse würden ungefähr so aussehen:
ProductID
Preis
680
1.432,00 $
706
1.432,00 $
707
35,00 $
...
...