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

Fix Msg 8117 "Operand data type varchar er ugyldig for sum operator" i SQL Server

Hvis du får SQL Server-fejlmeddelelse 8117 med meddelelsen Operand datatype varchar er ugyldig for sumoperator , det er fordi du videregiver den forkerte datatype til en operatør eller funktion.

I dette tilfælde indikerer fejlen, at vi sender en streng til SUM() fungere. Than SUM() funktionen fungerer ikke på strenge. Det virker kun på numeriske typer.

Den samme fejl (Msg 8117) kan også forekomme i andre sammenhænge – den er ikke begrænset til SUM() funktion.

Eksempel på fejlen

Her er et eksempel på kode, der producerer fejlen:

SELECT SUM(ProductName) 
FROM Products;

Resultat:

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

I dette tilfælde forsøger vi at tilføje ProductName kolonne.

I dette tilfælde er det højst sandsynligt, at ProductName kolonne er en varchar kolonne. Vi har sandsynligvis fået den forkerte kolonne.

Løsning 1

For at rette denne fejl bør vi først kontrollere, at vi har den rigtige kolonne. Hvis vi ikke har den korrekte kolonne, skal du ændre den til den korrekte kolonne:

SELECT SUM(Price) 
FROM Products;

Forhåbentlig løser det problemet. Med andre ord, forhåbentlig Price kolonnen er numerisk, som den burde være.

Men hvad hvis det ikke er det?

Løsning 2

I nogle tilfælde kan du opleve, at du har den rigtige kolonne, men den kolonne bruger en upassende datatype. Antag f.eks. vores Price kolonne blev faktisk defineret som en varchar kolonne.

I så fald får vi den samme fejl:

SELECT SUM(Price) 
FROM Products;

Resultat:

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

Ved første øjekast ser intet ud til at være galt med denne udtalelse. Alt, hvad vi gør, er at få en total af værdierne i Price kolonne. Dette er et perfekt eksempel på, hvad SUM() funktion blev designet til at gøre.

Selvfølgelig er antagelsen her, at Price kolonne er numerisk. Men ifølge fejlmeddelelsen er det ikke numerisk - det er en varchar .

Lad os tjekke kolonnens datatype:

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

Resultat:

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

Som mistænkt er kolonnen af ​​typen varchar .

I dette tilfælde har vi to muligheder; ændre kolonnens type, eller konverter dens type med det samme, når du får dens sum.

Lad os konvertere dens type med det samme:

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

Resultat:

48.25

Dette virkede heldigvis.

I dette tilfælde er alle data i Price kolonne kan konverteres til en numerisk type.

Hvis du får fejlmeddelelse 8114, der lyder noget som Fejl ved konvertering af datatype varchar til numerisk , så betyder det, at kolonnen indeholder data, der ikke kan konverteres til numeriske.

Fejlen ser således ud:

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

I dette tilfælde skal du finde de ikke-numeriske data og beslutte, hvad du skal gøre med dem.

Sådan kan vi finde de ikke-numeriske værdier:

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

Resultat:

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

Vi har fundet de skyldige!

Medmindre der er en god grund til at lade være, bør vi ændre disse værdier til deres numeriske ækvivalenter.

Derefter bør vi overveje at ændre kolonnens datatype, så denne type data ikke kan indsættes i fremtiden. Hvis du gør dette, hjælper det med at håndhæve dataintegriteten.

Én ting skal du være opmærksom på, når du bruger ISNUMERIC() funktion er, at det nogle gange kan returnere falske positiver. Hvad jeg mener er, at der er nogle ikke-numeriske tegn, der tolkes som numeriske. Se ikke-taltegn, der returnerer positivt, når du bruger ISNUMERIC() for mere om dette.


  1. mysql_num_rows():det leverede argument er ikke en gyldig MySQL resultatressource

  2. 2 eksempeldatabaser til SQLite

  3. Neo4j browser

  4. Indsæt data fra en tabel i en anden i MySQL