Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Correggere il messaggio 8117 "Il tipo di dati dell'operando varchar non è valido per l'operatore somma" in SQL Server

Se ricevi un messaggio di errore SQL Server 8117 con il messaggio Il tipo di dati dell'operando varchar non è valido per l'operatore somma , è perché stai passando il tipo di dati sbagliato a un operatore o a una funzione.

In questo caso, l'errore indica che stiamo passando una stringa a SUM() funzione. Tegli SUM() la funzione non opera sulle stringhe. Funziona solo su tipi numerici.

Lo stesso errore (Msg 8117) può verificarsi anche in altri contesti:non è limitato a SUM() funzione.

Esempio di errore

Ecco un esempio di codice che produce l'errore:

SELECT SUM(ProductName) 
FROM Products;

Risultato:

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

In questo caso, stiamo cercando di sommare il ProductName colonna.

In questo caso, è molto probabile che il ProductName colonna è un varchar colonna. Probabilmente abbiamo sbagliato colonna.

Soluzione 1

Per correggere questo errore, dobbiamo prima verificare di avere la colonna corretta. Se non abbiamo la colonna corretta, cambiala nella colonna corretta:

SELECT SUM(Price) 
FROM Products;

Speriamo che risolva il problema. In altre parole, si spera che il Price la colonna è numerica, come dovrebbe essere.

E se non lo fosse?

Soluzione 2

In alcuni casi potresti scoprire di avere la colonna corretta, ma quella colonna utilizza un tipo di dati inappropriato. Ad esempio, supponiamo il nostro Price colonna è stata effettivamente definita come varchar colonna.

In tal caso, avremmo lo stesso errore:

SELECT SUM(Price) 
FROM Products;

Risultato:

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

A prima vista, nulla sembra essere sbagliato in questa affermazione. Tutto ciò che stiamo facendo è ottenere un totale dei valori nel Price colonna. Questo è un perfetto esempio di ciò che è SUM() la funzione è stata progettata per fare.

Naturalmente, il presupposto qui è che il Price la colonna è numerica. Ma secondo il messaggio di errore, non è numerico:è un varchar .

Controlliamo il tipo di dati della colonna:

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

Risultato:

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

Come sospettato, la colonna è di tipo varchar .

In questo caso, abbiamo due opzioni; cambia il tipo della colonna o converti il ​​suo tipo al volo quando ottieni la sua somma.

Convertiamo il suo tipo al volo:

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

Risultato:

48.25

Questo ha funzionato, fortunatamente.

In questo caso, tutti i dati nel Price colonna può essere convertita in un tipo numerico.

Se ricevi un messaggio di errore 8114 che legge qualcosa come Errore durante la conversione del tipo di dati varchar in numerico , significa che la colonna contiene dati che non possono essere convertiti in numerici.

L'errore è questo:

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

In questo caso, dovrai trovare i dati non numerici e decidere cosa farne.

Ecco come possiamo trovare i valori non numerici:

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

Risultato:

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

Abbiamo trovato i colpevoli!

A meno che non ci sia una buona ragione per non farlo, dovremmo cambiare quei valori con i loro equivalenti numerici.

Successivamente, dovremmo considerare di modificare il tipo di dati della colonna, in modo che questo tipo di dati non possa essere inserito in futuro. Farlo aiuterà a rafforzare l'integrità dei dati.

Una cosa da tenere presente quando si utilizza ISNUMERIC() funzione è che a volte può restituire falsi positivi. Quello che voglio dire è che ci sono alcuni caratteri non numerici che vengono interpretati come numerici. Consulta i caratteri non numerici che restituiscono positivi quando si utilizza ISNUMERIC() per ulteriori informazioni.