Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Napraw komunikat 8117 „Operand typ danych varchar jest nieprawidłowy dla operatora sumy” w SQL Server

Jeśli otrzymujesz komunikat o błędzie SQL Server 8117 z komunikatem Operand typ danych varchar jest nieprawidłowy dla operatora sumy , dzieje się tak, ponieważ przekazujesz niewłaściwy typ danych do operatora lub funkcji.

W tym przypadku błąd wskazuje, że przekazujemy ciąg do SUM() funkcjonować. Ton SUM() funkcja nie działa na ciągach. Działa tylko na typach numerycznych.

Ten sam błąd (Msg 8117) może wystąpić również w innych kontekstach – nie ogranicza się do SUM() funkcja.

Przykład błędu

Oto przykład kodu, który generuje błąd:

SELECT SUM(ProductName) 
FROM Products;

Wynik:

Msg 8117, Level 16, State 1, Line 1
Operand data type varchar is invalid for sum operator.

W tym przypadku próbujemy dodać ProductName kolumna.

W takim przypadku jest bardzo prawdopodobne, że ProductName kolumna jest varchar kolumna. Prawdopodobnie mamy złą kolumnę.

Rozwiązanie 1

Aby naprawić ten błąd, powinniśmy najpierw sprawdzić, czy mamy poprawną kolumnę. Jeśli nie mamy właściwej kolumny, zmień ją na właściwą kolumnę:

SELECT SUM(Price) 
FROM Products;

Mam nadzieję, że to rozwiąże problem. Innymi słowy, miejmy nadzieję, że Price kolumna jest numeryczna, tak jak powinna być.

Ale co, jeśli nie jest?

Rozwiązanie 2

W niektórych przypadkach może się okazać, że masz poprawną kolumnę, ale ta kolumna używa nieodpowiedniego typu danych. Załóżmy na przykład, że nasza Price kolumna została faktycznie zdefiniowana jako varchar kolumna.

W takim przypadku otrzymalibyśmy ten sam błąd:

SELECT SUM(Price) 
FROM Products;

Wynik:

Msg 8117, Level 16, State 1, Line 1
Operand data type varchar is invalid for sum operator.

Na pierwszy rzut oka w tym stwierdzeniu nie wydaje się nic złego. Wszystko, co robimy, to uzyskiwanie sumarycznych wartości w Price kolumna. To doskonały przykład tego, co SUM() funkcja została zaprojektowana do wykonania.

Oczywiście zakłada się tutaj, że Price kolumna jest numeryczna. Ale zgodnie z komunikatem o błędzie nie jest to liczba – to varchar .

Sprawdźmy typ danych kolumny:

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';

Wynik:

+-------------+--------------+----------------+
| DATA_TYPE   | MAX_LENGTH   | OCTET_LENGTH   |
|-------------+--------------+----------------|
| varchar     | 255          | 255            |
+-------------+--------------+----------------+

Zgodnie z podejrzeniami, kolumna jest typu varchar .

W tym przypadku mamy dwie opcje; zmień typ kolumny lub przekonwertuj jej typ w locie podczas pobierania jej sumy.

Przekształćmy jego typ w locie:

SELECT SUM(CAST(Price AS decimal(8,2))) 
FROM Products;

Wynik:

48.25

Na szczęście to zadziałało.

W tym przypadku wszystkie dane w Price kolumnę można przekonwertować na typ liczbowy.

Jeśli pojawi się komunikat o błędzie 8114, który brzmi jak Błąd konwersji typu danych varchar na numeryczny , oznacza to, że kolumna zawiera dane, których nie można przekonwertować na wartości liczbowe.

Błąd wygląda tak:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.

W takim przypadku musisz znaleźć dane nieliczbowe i zdecydować, co z nimi zrobić.

Oto jak możemy znaleźć wartości nieliczbowe:

SELECT Price
FROM Products
WHERE ISNUMERIC(Price) <> 1;

Wynik:

+-------------+
| Price       |
|-------------|
| Ten dollars |
| Fifteen     |
+-------------+

Znaleźliśmy winowajców!

O ile nie ma dobrego powodu, aby tego nie robić, powinniśmy zmienić te wartości na ich odpowiedniki liczbowe.

Następnie powinniśmy rozważyć zmianę typu danych kolumny, aby w przyszłości nie można było wstawić tego typu danych. Pomoże to wymusić integralność danych.

Jedna rzecz, o której należy pamiętać podczas korzystania z ISNUMERIC() funkcja polega na tym, że czasami może zwracać fałszywe alarmy. Chodzi mi o to, że istnieją pewne znaki nieliczbowe, które są interpretowane jako numeryczne. Zobacz Znaki nieliczbowe, które zwracają wartość dodatnią podczas używania ISNUMERIC() aby dowiedzieć się więcej na ten temat.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Implementacja wspólnego wskaźnika wydajności MS SQL Server

  2. Czy unikalny klucz serwera SQL jest również indeksem?

  3. Utwórz bazę danych w SQL Server 2017

  4. Jak zwrócić liczby losowe jako kolumnę w SQL Server 2005?

  5. Najważniejsze funkcje narzędzia do monitorowania SQL Server