sql >> Base de Datos >  >> RDS >> Sqlserver

Corrija el mensaje 8117 "El tipo de datos de operando varchar no es válido para el operador de suma" en SQL Server

Si recibe el mensaje de error 8117 de SQL Server con el mensaje El tipo de datos del operando varchar no es válido para el operador de suma , es porque está pasando el tipo de datos incorrecto a un operador o función.

En este caso, el error indica que estamos pasando una cadena a SUM() función. Tél SUM() La función no opera en cadenas. Solo funciona en tipos numéricos.

El mismo error (Msg 8117) también puede ocurrir en otros contextos; no se limita a SUM() función.

Ejemplo del error

Aquí hay un ejemplo de código que produce el error:

SELECT SUM(ProductName) 
FROM Products;

Resultado:

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

En este caso, estamos intentando sumar el ProductName columna.

En este caso, es muy probable que ProductName la columna es un varchar columna. Probablemente nos hemos equivocado de columna.

Solución 1

Para corregir este error, primero debemos verificar que tenemos la columna correcta. Si no tenemos la columna correcta, cámbiela a la columna correcta:

SELECT SUM(Price) 
FROM Products;

Esperemos que eso resuelva el problema. En otras palabras, esperemos que el Price la columna es numérica, como debería ser.

Pero, ¿y si no lo es?

Solución 2

En algunos casos, puede encontrar que tiene la columna correcta, pero esa columna usa un tipo de datos inapropiado. Por ejemplo, supongamos que nuestro Price la columna en realidad se definió como varchar columna.

En ese caso, obtendríamos el mismo error:

SELECT SUM(Price) 
FROM Products;

Resultado:

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

A primera vista, nada parece estar mal con esta declaración. Todo lo que estamos haciendo es obtener un total de los valores en el Price columna. Este es un ejemplo perfecto de lo que SUM() función fue diseñada para hacer.

Por supuesto, la suposición aquí es que el Price la columna es numérica. Pero según el mensaje de error, no es numérico, es un varchar .

Verifiquemos el tipo de datos de la columna:

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

Resultado:

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

Como se sospechaba, la columna es de tipo varchar .

En este caso, tenemos dos opciones; cambie el tipo de la columna o convierta su tipo sobre la marcha al obtener su suma.

Convirtamos su tipo sobre la marcha:

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

Resultado:

48.25

Esto funcionó, afortunadamente.

En este caso, todos los datos en el Price la columna se puede convertir a un tipo numérico.

Si recibe el mensaje de error 8114 que dice algo como Error al convertir el tipo de datos varchar a numérico , significa que la columna contiene datos que no se pueden convertir a numéricos.

El error se ve así:

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

En este caso, deberá encontrar los datos no numéricos y decidir qué hacer con ellos.

Así es como podemos encontrar los valores no numéricos:

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

Resultado:

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

¡Hemos encontrado a los culpables!

A menos que haya una buena razón para no hacerlo, debemos cambiar esos valores a sus equivalentes numéricos.

Después de eso, deberíamos considerar cambiar el tipo de datos de la columna, para que este tipo de datos no se pueda insertar en el futuro. Hacer esto ayudará a reforzar la integridad de los datos.

Una cosa a tener en cuenta al usar ISNUMERIC() función es que a veces puede devolver falsos positivos. Lo que quiero decir es que hay algunos caracteres no numéricos que se interpretan como numéricos. Ver caracteres no numéricos que devuelven positivo al usar ISNUMERIC() para obtener más información sobre esto.