Si vous obtenez l'erreur SQL Server Msg 8117 avec le message Le type de données d'opérande varchar n'est pas valide pour l'opérateur somme , c'est parce que vous transmettez le mauvais type de données à un opérateur ou à une fonction.
Dans ce cas, l'erreur indique que nous passons une chaîne au SUM()
une fonction. Tle SUM()
La fonction n'opère pas sur les chaînes. Cela ne fonctionne que sur les types numériques.
La même erreur (Msg 8117) peut également se produire dans d'autres contextes - elle n'est pas limitée au SUM()
fonction.
Exemple d'erreur
Voici un exemple de code qui génère l'erreur :
SELECT SUM(ProductName)
FROM Products;
Résultat :
Msg 8117, Niveau 16, État 1, Ligne 1Le type de données d'opérande varchar n'est pas valide pour l'opérateur somme.
Dans ce cas, nous essayons d'ajouter le ProductName
colonne.
Dans ce cas, il est fort probable que le ProductName
la colonne est un varchar
colonne. Nous avons probablement la mauvaise colonne.
Solution 1
Pour corriger cette erreur, nous devons d'abord vérifier que nous avons la bonne colonne. Si nous n'avons pas la bonne colonne, remplacez-la par la bonne colonne :
SELECT SUM(Price)
FROM Products;
Espérons que cela résout le problème. En d'autres termes, espérons que le Price
colonne est numérique, comme il se doit.
Et si ce n'est pas le cas ?
Solution 2
Dans certains cas, vous pouvez constater que vous avez la bonne colonne, mais cette colonne utilise un type de données inapproprié. Par exemple, supposons que notre Price
la colonne était en fait définie comme un varchar
colonne.
Dans ce cas, nous obtiendrions la même erreur :
SELECT SUM(Price)
FROM Products;
Résultat :
Msg 8117, Niveau 16, État 1, Ligne 1Le type de données d'opérande varchar n'est pas valide pour l'opérateur somme.
À première vue, rien ne semble être faux avec cette déclaration. Tout ce que nous faisons est d'obtenir un total des valeurs dans le Price
colonne. Ceci est un exemple parfait de ce que le SUM()
fonction a été conçue pour faire.
Bien sûr, l'hypothèse ici est que le Price
colonne est numérique. Mais selon le message d'erreur, ce n'est pas numérique - c'est un varchar
.
Vérifions le type de données de la colonne :
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';
Résultat :
+-------------+-------------+----------------+ | DATA_TYPE | MAX_LENGTH | OCTET_LENGTH ||-------------+--------------+----------------|| varchar | 255 | 255 |+-------------+-------------+----------------+Comme suspecté, la colonne est de type
varchar
.Dans ce cas, nous avons deux options; modifier le type de la colonne ou convertir son type à la volée lors de l'obtention de sa somme.
Convertissons son type à la volée :
SELECT SUM(CAST(Price AS decimal(8,2))) FROM Products;
Résultat :
48,25Cela a fonctionné, heureusement.
Dans ce cas, toutes les données du
Price
colonne peut être convertie en un type numérique.Si vous obtenez l'erreur Msg 8114 qui lit quelque chose comme Erreur lors de la conversion du type de données varchar en numérique , cela signifie que la colonne contient des données qui ne peuvent pas être converties en numérique.
L'erreur ressemble à ceci :
Msg 8114, Niveau 16, État 5, Ligne 1Erreur lors de la conversion du type de données varchar en numérique.Dans ce cas, vous devrez trouver les données non numériques et décider quoi en faire.
Voici comment trouver les valeurs non numériques :
SELECT Price FROM Products WHERE ISNUMERIC(Price) <> 1;
Résultat :
+-------------+| Prix ||-------------|| Dix dollars || Quinze |+-------------+Nous avons trouvé les coupables !
À moins qu'il n'y ait une bonne raison de ne pas le faire, nous devrions remplacer ces valeurs par leurs équivalents numériques.
Après cela, nous devrions envisager de changer le type de données de la colonne, afin que ce type de données ne puisse plus être inséré à l'avenir. Cela aidera à renforcer l'intégrité des données.
Une chose à garder à l'esprit lors de l'utilisation du
ISNUMERIC()
fonction est qu'elle peut parfois renvoyer des faux positifs. Ce que je veux dire, c'est qu'il y a des caractères non numériques qui sont interprétés comme numériques. Voir Caractères non numériques qui retournent positifs lors de l'utilisation deISNUMERIC()
pour en savoir plus à ce sujet.