Nachfolgend finden Sie eine Liste mit den SQL Server-Datentypen in der Reihenfolge ihrer Priorität.
- benutzerdefinierte Datentypen (höchste)
sql_variant
xml
datetimeoffset
datetime2
datetime
smalldatetime
date
time
float
real
decimal
money
smallmoney
bigint
int
smallint
tinyint
bit
ntext
text
image
timestamp
uniqueidentifier
nvarchar
(einschließlichnvarchar(max)
)nchar
varchar
(einschließlichvarchar(max)
)char
varbinary
(einschließlichvarbinary(max)
)binary
(niedrigste)
Wenn Sie Operanden verschiedener Datentypen mit einem Operator kombinieren, wird der Datentyp mit der niedrigeren Priorität zuerst in den Datentyp mit der höheren Priorität konvertiert.
Wenn die Konvertierung keine unterstützte implizite Konvertierung ist, wird ein Fehler zurückgegeben.
Wenn beide Operanden vom gleichen Typ sind, wird keine Konvertierung durchgeführt (oder benötigt) und das Ergebnis der Operation verwendet den Datentyp der Operanden.
Beispiel
Hier ist ein Beispiel für eine erfolgreiche implizite Konvertierung:
SELECT 1 * 1.00;
Ergebnis:
1.00
Dabei wurde der linke Operand in den Datentyp des rechten Operanden konvertiert.
Hier ist eine explizitere Methode:
DECLARE
@n1 INT,
@n2 DECIMAL(5, 2);
SET @n1 = 1;
SET @n2 = 1;
SELECT @n1 * @n2;
Ergebnis:
1.00
In diesem Fall habe ich den linken Operanden explizit als INT
deklariert und der rechte Operand als DECIMAL(5, 2)
.
Wir können die Ergebnisse mit dem sys.dm_exec_describe_first_result_set
weiter untersuchen systemdynamische Verwaltungsfunktion.
Diese Funktion ermöglicht es uns, den Datentyp jeder Spalte zu überprüfen, die in einer Abfrage zurückgegeben wird:
SELECT
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
'DECLARE @n1 INT, @n2 DECIMAL(5, 2);
SET @n1 = 1;
SET @n2 = 1;
SELECT @n1, @n2, @n1 * @n2;',
null,
0);
Ergebnis:
+--------------------+--------------+-------------+---------+ | system_type_name | max_length | precision | scale | |--------------------+--------------+-------------+---------| | int | 4 | 10 | 0 | | decimal(5,2) | 5 | 5 | 2 | | decimal(16,2) | 9 | 16 | 2 | +--------------------+--------------+-------------+---------+
Hier können wir sehen, dass jede Zeile jede von der Abfrage zurückgegebene Spalte darstellt. Daher war die erste Spalte ein INT
, die zweite Spalte war DECIMAL(5,2)
, und die dritte Spalte ein DECIMAL(16,2)
.
Also gab SQL Server tatsächlich ein DECIMAL(16,2)
zurück , obwohl der ursprüngliche Dezimalwert ein DECIMAL(5,2)
war .
Beispiel für einen Konvertierungsfehler
Wie bereits erwähnt, wird ein Fehler zurückgegeben, wenn die Konvertierung keine unterstützte implizite Konvertierung ist:
SELECT 'Age: ' + 10;
Ergebnis:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value 'Age: ' to data type int.
In diesem Fall habe ich versucht, eine Zeichenfolge zu verketten (VARCHAR
) und eine Zahl (INT
). Als INT
zu sehen hat eine höhere Priorität als VARCHAR
, hat SQL Server versucht, die Zeichenfolge implizit in einen INT
zu konvertieren .
Dies ist fehlgeschlagen, da diese Zeichenfolge nicht in eine Ganzzahl konvertiert werden kann.
Um dies zu umgehen, können wir zuerst den INT
umwandeln zu VARCHAR
:
SELECT 'Age: ' + CAST(10 AS VARCHAR(2));
Ergebnis:
Age: 10
Jetzt haben beide Operanden denselben Datentyp, und SQL Server führt die Operation erfolgreich aus, ohne dass implizite Konvertierungen durchgeführt werden müssen.
Eine andere Möglichkeit, diese spezielle Operation durchzuführen, ist mit CONCAT()
Funktion:
SELECT CONCAT('Age: ', 10);
Ergebnis:
Age: 10
Der CONCAT()
function ist eine String-Funktion und wandelt daher alle Argumente vor der Verkettung implizit in String-Typen um. Daher mussten wir keine explizite Konvertierung durchführen.
Wenn der String-Operand jedoch implizit in eine Zahl konvertiert werden kann, verursacht dies bei Verwendung von +
keinen Fehler Betreiber:
SELECT '10' + 10;
Ergebnis:
20
Aber in diesem Fall das +
-Operator wird zu einem mathematischen Additionsoperator und nicht zu einem String-Verkettungsoperator.