Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Behebung von Msg 8117 „Operandendatentyp varchar ist für Summenoperator ungültig“ in SQL Server

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.