Datentypkonvertierung (Datenbank-Engine)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-Endpunkt in Microsoft FabricWarehouse 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() konvertiert das Datumsformat implizit in 0. SYSDATETIME() konvertiert das Datumsformat implizit in 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.

Data type conversion table

Das Diagramm oben 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. Beachten Sie, dass der Operator + eher zu einer Addition als zu einer Verkettung führt, 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. nchar kann nur mit der expliziten Konvertierung in binary konvertiert werden; eine implizite Konvertierung in binary wird nicht unterstützt. nchar kann jedoch explizit oder implizit in nvarchar konvertiert werden.

In den folgenden Themen wird das Konvertierungsverhalten der entsprechenden Datentypen beschrieben:

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 Eindimensionales Byte()-Array
int Long
smallint Integer
tinyint Byte
float Double
real Single
money, smallmoney Währung
datetime, smalldatetime Datum
Beliebige auf NULL festgelegte Typen 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 bis Länge 1**)** auf, wobei Länge der Anzahl von Bytes 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 4000 Zeichen varchar/nvarchar
String mit mehr als 4000 Zeichen text/ntext
Eindimensionales Byte()-Array mit maximal 8000 Byte varbinary
Eindimensionales Byte()-Array mit mehr als 8000 Byte image

Siehe auch

Gespeicherte OLE-Automatisierungsprozeduren (Transact-SQL)
CAST und CONVERT (Transact-SQL)
Datentypen (Transact-SQL)
COLLATE (Transact-SQL)