Datentypkonvertierung (Datenbank-Engine)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL-Analyseendpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank in Microsoft Fabric
Datentypen können in den folgenden Szenarien konvertiert werden:
- Wenn Daten aus einem Objekt zu einem anderen Objekt verschoben oder mit diesem verglichen oder kombiniert werden, müssen die Daten möglicherweise vom Datentyp des einen Objekts in den Datentyp des anderen Objekts konvertiert werden.
- Wenn Daten aus einer Ergebnisspalte, einem Rückgabecode oder einem Ausgabeparameter von Transact-SQL in eine Programmvariable verschoben werden, müssen die Daten vom SQL Server-Systemdatentyp in den Datentyp der Variablen konvertiert werden.
Bei der Konvertierung zwischen einer Anwendungsvariablen und einer Resultsetspalte, einem Rückgabecode, einem Parameter oder Parametermarker von SQL Server werden die unterstützten Datentypkonvertierungen von der Datenbank-API (Application Programming Interface, Anwendungsprogrammierschnittstelle) definiert.
Implizite und explizite Konvertierung
Datentypen können entweder implizit oder explizit konvertiert werden.
Implizite Konvertierungen sind für den Benutzer nicht sichtbar. SQL Server konvertiert die Daten automatisch von einem Datentyp in einen anderen. Beispielsweise wird beim Vergleich eines smallint-Datentyps mit einem int-Datentyp der smallint-Datentyp implizit in int konvertiert, bevor der Vergleich fortgesetzt wird.
GETDATE()
Wandelt implizit in datumsformatvorlage 0
um. SYSDATETIME()
konvertiert implizit in das Datumsformat 21
.
Explizite Konvertierungen verwenden die Funktionen CAST
oder CONVERT
.
Die Funktionen CAST und CONVERT konvertieren einen Wert (eine lokale Variable, eine Spalte oder einen anderen Ausdruck) von einem Datentyp in einen anderen. Die folgende CAST
-Funktion konvertiert z. B. den numerischen Wert $157.27
in die Zeichenfolge '157.27'
:
CAST ( $157.27 AS VARCHAR(10) )
Verwenden Sie CAST
anstelle von CONVERT
, wenn der Transact-SQL-Programmcode dem ISO-Standard entsprechen soll. Verwenden Sie hingegen CONVERT
anstelle von CAST
, wenn Sie die Vorteile der Formatfunktionen in CONVERT
nutzen möchten.
In der folgenden Abbildung werden alle expliziten und impliziten Datentypkonvertierungen aufgeführt, die für die vom SQL Server-System bereitgestellten Datentypen zulässig sind. Dazu gehören xml, bigint und sql_variant. Es gibt keine implizite Konvertierung bei der Zuweisung vom sql_variant-Datentyp, eine implizite Konvertierung zum sql_variant-Datentyp findet jedoch statt.
Das vorherige Diagramm veranschaulicht zwar alle expliziten und impliziten Konvertierungen, die in SQL Server zulässig sind, gibt aber nicht den sich ergebenden Datentyp der Konvertierung an.
- Wenn SQL Server eine explizite Konvertierung ausführt, bestimmt die Anweisung selbst den sich ergebenden Datentyp.
- Bei impliziten Konvertierungen führen Zuweisungsanweisungen wie das Festlegen des Werts einer Variablen oder das Einfügen eines Werts in eine Spalte zu dem Datentyp, der durch die Variablendeklaration oder Spaltendefinition definiert wurde.
- Bei Vergleichsoperatoren oder anderen Ausdrücken hängt der sich ergebende Datentyp von den Regeln der Datentyprangfolge ab.
Das folgende Skript definiert z. B. eine Variable vom Typ varchar, weist der Variablen einen int-Typwert zu und wählt dann eine Verkettung der Variablen mit einer Zeichenfolge aus.
DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.'
Der int-Wert von 1
wird in einen varchar-Wert konvertiert, sodass die SELECT
-Anweisung den Wert 1 is a string.
zurückgibt.
Das folgende Beispiel zeigt stattdessen ein ähnliches Skript mit einer int-Variablen:
DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + ' is not a string.'
In diesem Fall löst die SELECT
-Anweisung den folgenden Fehler aus:
Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value ' is not a string.' to data type int.
Um den Ausdruck @notastring + ' is not a string.'
auszuwerten, folgt SQL Server den Regeln der Datentyprangfolge, um die implizite Konvertierung abzuschließen, bevor das Ergebnis des Ausdrucks berechnet werden kann. Da int eine höhere Rangfolge als varchar hat, versucht SQL Server, die Zeichenfolge in einen Integerwert zu konvertieren, und schlägt fehl, da diese Zeichenfolge nicht in einen Integerwert konvertiert werden kann. Wenn der Ausdruck eine Zeichenfolge bereitstellt, die konvertiert werden kann, wird die Anweisung erfolgreich ausgeführt, wie im folgenden Beispiel gezeigt:
DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + '1'
In diesem Fall kann die Zeichenfolge 1
in den Integerwert 1
konvertiert werden, sodass diese SELECT
-Anweisung den Wert 2
zurückgibt. Der Operator +
führt eher zu einer Addition als zu einer Verkettung, wenn die angegebenen Datentypen Integerwerte sind.
Verhalten bei der Datentypkonvertierung
Einige implizite und explizite Datentypkonvertierungen werden nicht unterstützt, wenn Sie den Datentyp eines SQL Server-Objekts in einen anderen konvertieren. Ein nchar-Wert kann nicht in einen image-Wert konvertiert werden. Ein nchar kann nur mithilfe einer expliziten Konvertierung nach binary konvertiert werden. Eine implizite Konvertierung nach binary wird nicht unterstützt. nchar kann jedoch explizit oder implizit in nvarchar konvertiert werden.
In den folgenden Artikeln wird das Konvertierungsverhalten der entsprechenden Datentypen beschrieben:
- binary und varbinary
- datetime2
- money und smallmoney
- bit
- datetimeoffset
- smalldatetime
- char und varchar
- decimal und numeric
- sql_variant
- date
- float und real
- time
- datetime
- int, bigint, smallint und tinyint
- uniqueidentifier
- xml
- json
Konvertieren von Datentypen mithilfe von gespeicherten Prozeduren der OLE-Automatisierung
Da SQL Server Transact-SQL-Datentypen und die OLE-Automatisierung Visual Basic-Datentypen verwendet, müssen die gespeicherten Prozeduren der OLE-Automatisierung die übergebenen Daten konvertieren.
In der folgenden Tabelle werden die Konvertierungen von SQL Server-Datentypen in Visual Basic-Datentypen dargestellt.
SQL Server-Datentyp | Datentyp in Visual Basic |
---|---|
char, varchar, text, nvarchar, ntext | String |
decimal, numeric | String |
bit | Boolescher Wert |
binary, varbinary, image | Eindimensionale Byte() -Arrays |
int | Long |
smallint | Integer |
tinyint | Byte |
float | Double |
real | Single |
money, smallmoney | Währung |
datetime, smalldatetime | Datum |
Alles, was auf NULL festgelegt wird |
Variant wurde auf NULL festgelegt. |
Alle einzelnen SQL Server-Werte mit Ausnahme der binary-, varbinary- und image-Werte werden in einen einzelnen Visual Basic-Wert konvertiert. Diese Werte werden in ein eindimensionales Byte()
-Array in Visual Basic konvertiert. Dieses Array weist einen Bereich von Byte( 0 to length 1)
auf, wobei length der Anzahl von Byte in den SQL Server-Werten binary, varbinary oder image entspricht.
Im Folgenden sehen Sie die Konvertierungen von Visual Basic-Datentypen in SQL Server-Datentypen.
Datentyp in Visual Basic | SQL Server-Datentyp |
---|---|
Long, Integer, Byte, Boolean, Object | int |
Double, Single | float |
Währung | money |
Datum | datetime |
String mit maximal 4.000 Zeichen | varchar/nvarchar |
String mit mehr als 4.000 Zeichen | text/ntext |
Eindimensionales Byte() -Array mit maximal 8.000 Byte |
varbinary |
Eindimensionales Byte() -Array mit mehr als 8.000 Byte |
Abbildung |