Wenn Sie die SQL Server-Fehlermeldung 8117 mit der Meldung Operand data type varchar is invalid for sum operator erhalten , liegt es daran, dass Sie den falschen Datentyp an einen Operator oder eine Funktion übergeben.
In diesem Fall zeigt der Fehler an, dass wir eine Zeichenfolge an SUM()
übergeben Funktion. Tdie SUM()
Die Funktion arbeitet nicht mit Strings. Es funktioniert nur bei numerischen Typen.
Derselbe Fehler (Msg 8117) kann auch in anderen Kontexten auftreten – er ist nicht auf SUM()
beschränkt Funktion.
Beispiel für den Fehler
Hier ist ein Codebeispiel, das den Fehler erzeugt:
SELECT SUM(ProductName)
FROM Products;
Ergebnis:
Msg 8117, Level 16, State 1, Line 1 Operand data type varchar is invalid for sum operator.
In diesem Fall versuchen wir, den ProductName
zu addieren Säule.
In diesem Fall ist es sehr wahrscheinlich, dass der ProductName
Spalte ist ein varchar
Säule. Wir haben wahrscheinlich die falsche Spalte erwischt.
Lösung 1
Um diesen Fehler zu beheben, sollten wir zuerst überprüfen, ob wir die richtige Spalte haben. Wenn wir nicht die richtige Spalte haben, ändern Sie sie in die richtige Spalte:
SELECT SUM(Price)
FROM Products;
Hoffentlich löst das das Problem. Mit anderen Worten, hoffentlich der Price
Spalte ist numerisch, wie es sein sollte.
Aber was, wenn nicht?
Lösung 2
In einigen Fällen stellen Sie möglicherweise fest, dass Sie die richtige Spalte haben, diese Spalte jedoch einen ungeeigneten Datentyp verwendet. Nehmen wir zum Beispiel unseren Price
an Spalte wurde eigentlich als varchar
definiert Spalte.
In diesem Fall erhalten wir denselben Fehler:
SELECT SUM(Price)
FROM Products;
Ergebnis:
Msg 8117, Level 16, State 1, Line 1 Operand data type varchar is invalid for sum operator.
An dieser Aussage scheint auf den ersten Blick nichts auszusetzen. Alles, was wir tun, ist die Summe der Werte im Price
zu erhalten Säule. Dies ist ein perfektes Beispiel dafür, was die SUM()
Funktion wurde entwickelt, um zu tun.
Voraussetzung ist hier natürlich, dass der Price
Spalte ist numerisch. Aber laut Fehlermeldung ist es nicht numerisch – es ist ein varchar
.
Lassen Sie uns den Datentyp der Spalte überprüfen:
SELECT
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH AS MAX_LENGTH,
CHARACTER_OCTET_LENGTH AS OCTET_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Products'
AND COLUMN_NAME = 'Price';
Ergebnis:
+-------------+--------------+----------------+ | DATA_TYPE | MAX_LENGTH | OCTET_LENGTH | |-------------+--------------+----------------| | varchar | 255 | 255 | +-------------+--------------+----------------+
Wie vermutet, ist die Spalte vom Typ varchar
.
In diesem Fall haben wir zwei Möglichkeiten; Ändere den Typ der Spalte oder konvertiere ihren Typ im Handumdrehen, wenn du ihre Summe erhältst.
Konvertieren wir seinen Typ im Handumdrehen:
SELECT SUM(CAST(Price AS decimal(8,2)))
FROM Products;
Ergebnis:
48.25
Das hat zum Glück funktioniert.
In diesem Fall alle Daten im Price
Spalte kann in einen numerischen Typ konvertiert werden.
Wenn Sie die Fehlermeldung 8114 erhalten, die so etwas wie Fehler beim Konvertieren des Datentyps varchar in numerisch lautet , dann bedeutet dies, dass die Spalte Daten enthält, die nicht in numerische Werte konvertiert werden können.
Der Fehler sieht so aus:
Msg 8114, Level 16, State 5, Line 1 Error converting data type varchar to numeric.
In diesem Fall müssen Sie die nicht numerischen Daten finden und entscheiden, was damit geschehen soll.
So finden wir die nicht numerischen Werte:
SELECT Price
FROM Products
WHERE ISNUMERIC(Price) <> 1;
Ergebnis:
+-------------+ | Price | |-------------| | Ten dollars | | Fifteen | +-------------+
Wir haben die Schuldigen gefunden!
Sofern kein triftiger Grund dagegen spricht, sollten wir diese Werte in ihre numerischen Äquivalente ändern.
Danach sollten wir in Betracht ziehen, den Datentyp der Spalte zu ändern, damit dieser Datentyp in Zukunft nicht mehr eingefügt werden kann. Dadurch wird die Datenintegrität durchgesetzt.
Beachten Sie bei der Verwendung von ISNUMERIC()
eine Sache Funktion ist, dass es manchmal falsch positive Ergebnisse zurückgeben kann. Was ich meine ist, dass es einige nicht-numerische Zeichen gibt, die als numerisch interpretiert werden. Siehe Nicht-Zahlenzeichen, die positiv zurückgegeben werden, wenn ISNUMERIC()
verwendet wird mehr dazu.