Arbeiten mit Datentypen
Spalten und Variablen, die in Transact-SQL verwendet werden, weisen jeweils einen Datentyp auf. 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
Datum/Uhrzeit
Binär
Sonstiges
TINYINT
Schweben
char
Datum
BINARY
Cursor
SMALLINT
real
varchar
time
varbinary
hierarchyid
INT
Text
Datum/Uhrzeit
Bild
sql_variant
BIGINT
NCHAR
datetime2
Tisch
bit
NVARCHAR
smalldatetime
Zeitstempel
decimal/numeric
ntext
datetimeoffset
UNIQUEIDENTIFIER
NUMERIC
Xml
Geld
Geografie
SMALLMONEY
Geometrie
Hinweis
Weitere Informationen zu den verschiedenen Datentypen und ihren Attributen finden Sie in der Transact-SQL Referenzdokumentation.
Datentypkonvertierung
Werte kompatibler Datentypen können bei Bedarf implizit konvertiert werden. Angenommen, Sie können den + Operator verwenden, um einer Dezimalzahl eine ganze Zahl hinzuzufügen, oder um einen Zeichenwert mit fester Länge und einen Variablenlängen-Varcharwert zu verketten. In einigen Fällen müssen Sie jedoch Werte explizit von einem Datentyp in einen anderen konvertieren. Zum Beispiel führt der Versuch, mit + einen Varchar-Wert mit einem Dezimal-Wert zu verketten, zu einem Fehler, es sei denn, Sie konvertieren den numerischen Wert zuerst in einen kompatiblen Zeichenfolgendatentyp.
Hinweis
Implizite und explizite Konvertierungen gelten für bestimmte Datentypen, und einige Konvertierungen sind nicht möglich. Für weitere Informationen verwenden Sie das Diagramm in der Transact-SQL Referenzdokumentation.
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 z. B. CAST, um die ganzzahligen Werte in der Spalte "ProductID " in Varchar-Werte (mit maximal 4 Zeichen) zu konvertieren, 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:
Produktname
680: HL Road Frame – Black, 58
706: HL Road Frame – Red, 58
707: Sport-100 Helm, Rot
708: Sport-100 Helm, Schwarz
...
Nehmen wir jedoch an, die Spalte Größe in der Tabelle Production.Product ist eine nvarchar-Spalte mit variabler Länge, 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 Werte in der Spalte numerisch sind, sollten Sie diese Werte 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, was verwendet wird, um anzugeben, dass ein Wert unbekannt ist.
Hinweis
Wir werden Überlegungen zur Behandlung von NULL-Werten weiter unten in dieser Einheit untersuchen.
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:
Produktname
680: HL Road Frame – Black, 58
706: HL Road Frame – Red, 58
707: Sport-100 Helm, Rot
708: Sport-100 Helm, Schwarz
...
Wie CAST weist CONVERT eine TRY_CONVERT Variante auf, die NULL für inkompatible Werte 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:
Verkaufsstartdatum
Startdatum
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 Formatierungscodes für Stilvorlagen, die Sie mit CONVERT verwenden können, können Sie in der Transact-SQL-Referenzdokumentation finden.
„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 CAST und CONVERT verfügt PARSE über eine TRY_PARSE Variante, die inkompatible Werte als NULL zurü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. Um dieses Konzept der Genauigkeit und Skalierung besser zu verstehen, lesen Sie die Transact-SQL Referenzdokumentation.
STR
Die STR-Funktion konvertiert einen numerischen Wert in eine Varchar.
Beispiel:
SELECT ProductID, '$' + STR(ListPrice) AS Price
FROM Production.Product;
Die Ergebnisse würden ungefähr so aussehen:
Produkt-ID
Preis
680
1.432,00 $
706
1.432,00 $
707
35,00 $
...
...