Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Поправете съобщение 8117 „Операнд типът данни varchar е невалиден за оператор сума“ в SQL Server

Ако получавате съобщение за грешка на 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() за повече информация.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Включване на таблици и схеми при изброяване на колоните за идентичност в база данни на SQL Server

  2. Как да преименувате база данни в SQL Server - SQL Server / TSQL урок, част 26

  3. Съвети за коригиране на фрагментацията на индекса на SQL Server

  4. Как да намерите дублирани записи с помощта на клауза Group by и Having в SQL Server - SQL Server / TSQL Урок, част 132

  5. T-SQL разделен низ