Ако получавате съобщение за грешка на SQL Server 8117 със съобщението Операнд типът данни varchar е невалиден за оператор за сума , това е, защото предавате грешен тип данни на оператор или функция.
В този случай грешката показва, че предаваме низ към SUM()
функция. Tтой SUM()
функцията не работи върху низове. Работи само с числови типове.
Същата грешка (Msg 8117) може да възникне и в други контексти – тя не е ограничена до SUM()
функция.
Пример за грешката
Ето пример за код, който създава грешката:
ИЗБЕРЕТЕ СУМА(име на продукт) ОТ продукти;
Резултат:
Съобщение 8117, ниво 16, състояние 1, ред 1 Операнд тип данни varchar е невалиден за оператор сума.
В този случай се опитваме да добавим ProductName
колона.
В този случай е много вероятно ProductName
колоната е varchar
колона. Вероятно сме получили грешна колона.
Решение 1
За да коригираме тази грешка, първо трябва да проверим дали имаме правилната колона. Ако нямаме правилната колона, променете я на правилната колона:
ИЗБЕРЕТЕ СУМА (Цена) ОТ продукти;
Дано това реши проблема. С други думи, надявам се Цена
колоната е числова, както трябва да бъде.
Но какво ще стане, ако не е?
Решение 2
В някои случаи може да откриете, че имате правилната колона, но тази колона използва неподходящ тип данни. Например, да предположим, че нашата цена
колоната всъщност беше дефинирана като varchar
колона.
В този случай ще получим същата грешка:
ИЗБЕРЕТЕ СУМА(ЦЕНА) ОТ продукти;
Резултат:
Съобщение 8117, ниво 16, състояние 1, ред 1 Операнд тип данни varchar е невалиден за оператор сума.
На пръв поглед нищо не е наред в това твърдение. Всичко, което правим, е да получаваме общо стойностите в Price
колона. Това е перфектен пример за това какво е SUM()
функцията е проектирана да прави.
Разбира се, тук се предполага, че Price
колоната е числова. Но според съобщението за грешка, това не е числово – това е varchar
.
Нека проверим типа данни на колоната:
ИЗБЕРЕТЕ DATA_TYPE, CHARACTER_MAXIMUM_LENGTH КАТО MAX_LENGTH, CHARACTER_OCTET_LENGTH КАТО OCTET_LENGTH ОТ INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='Продукти' И COLUMN_NAME ='Цена';
Резултат:
+------------+--------------+----------------+ | DATA_TYPE | MAX_LENGTH | OCTET_LENGTH ||------------+--------------+----------------|| varchar | 255 | 255 |+------------+--------------+----------------+предварително>Както се подозира, колоната е от тип
varchar
.В този случай имаме две възможности; променете типа на колоната или преобразувайте типа й в движение, когато получавате нейната сума.
Нека преобразуваме типа му в движение:
ИЗБЕРЕТЕ СУМ(CAST(Цена КАТО десетична(8,2))) ОТ продукти;
Резултат:
48,25Това проработи, за щастие.
В този случай всички данни в
Цена
колоната може да се преобразува в числов тип.Ако получите съобщение за грешка 8114, което чете нещо като Грешка при преобразуването на типа данни varchar в числов , тогава това означава, че колоната съдържа данни, които не могат да бъдат преобразувани в числови.
Грешката изглежда така:
Съобщение 8114, ниво 16, състояние 5, ред 1 Грешка при преобразуването на типа данни varchar в числов.В този случай ще трябва да намерите нечисловите данни и да решите какво да правите с тях.
Ето как можем да намерим нечисловите стойности:
ИЗБЕРЕТЕ Цена ОТ ПродуктиWHERE ISNUMERIC(Цена) <> 1;
Резултат:
+------------+| Цена ||------------|| Десет долара || Петнадесет |+------------+Открихме виновниците!
Освен ако няма основателна причина да не го правим, трябва да променим тези стойности на техните числови еквиваленти.
След това трябва да помислим за промяна на типа данни на колоната, така че този тип данни да не могат да бъдат вмъквани в бъдеще. Това ще помогне за налагане на целостта на данните.
Едно нещо, което трябва да имате предвид, когато използвате
ISNUMERIC()
функцията е, че понякога може да връща фалшиви положителни резултати. Имам предвид, че има някои нечислови знаци, които се интерпретират като числови. Вижте нечислови знаци, които връщат положително, когато използватеISNUMERIC()
за повече информация.