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.