2010-09-01 3 views
1

Le ci-dessous fonctionne sql:Comment varchar implicite à des œuvres numériques jusqu'à 999 et ne fonctionne pas après

DECLARE @VAL1 VARCHAR(50), @VAL2 INT 
SET @VAL1 = '999' 
SET @VAL2 = 6414 
SELECT ROUND(CAST(((@VAL1 * 100.00)/@VAL2) AS FLOAT), 2) 

Où que celui-ci échoue avec « erreur de dépassement arithmétique conversion varchar numérique de type de données. »

DECLARE @VAL1 VARCHAR(50), @VAL2 INT 
SET @VAL1 = '1000' 
SET @VAL2 = 6414 
SELECT ROUND(CAST(((@VAL1 * 100.00)/@VAL2) AS FLOAT), 2) 

La seule différence entre les deux est que dans le second @ valeur VAL1 est 1000 au lieu de 999.

Répondre

3

Vous convertissez implicitement la chaîne en nombre par multtiplying avec un certain nombre. Le type du numéro avec lequel vous multipliez détermine le type dans lequel la chaîne est convertie. La base de données utilise le plus petit type numeric qui peut contenir le numéro 100.00 qui est numeric(5,2), donc c'est à ça que la chaîne est convertie aussi.

Si vous convertissez explicitement la chaîne en nombre, vous pouvez choisir un type qui peut gérer la plage dont vous avez besoin.

Si par exemple le convertir en un int il peut manipuler des valeurs jusqu'à '2147483647':

SELECT ROUND(CAST(((CAST(@VAL1 AS INT) * 100.00)/@VAL2) AS FLOAT), 2) 
+0

Merci pour la réponse. –

Questions connexes