web-dev-qa-db-fra.com

La conversion a échoué lors de la conversion de la valeur varchar 'simple' en type de données int

Je suis aux prises avec ce problème depuis quelques jours et je ne vois pas comment résoudre ce problème.

Je voudrais group by mon tableau sur les valeurs 1, 2, 3, 4, 5 donc j'ai créé un table temporaire avec cette valeur.

Maintenant, je dois INNER JOIN cette table avec d'autres tables sur a.value = #myTempTable.num.

MAIS a.value est ntext donc j’ai besoin de CONVERT ce que j’ai fait, mais je reçois une erreur:

La conversion a échoué lors de la conversion de la valeur varchar 'simple' en type de données int. (sur la ligne 7)

Create table #myTempTable
(
num int
)
insert into #myTempTable (num) values (1),(2),(3),(4),(5)

 SELECT a.name, CONVERT(INT, CONVERT(VARCHAR(12), a.value)) AS value, COUNT(*) AS pocet   
 FROM 
 (SELECT item.name, value.value 
  FROM mdl_feedback AS feedback 
  INNER JOIN mdl_feedback_item AS item 
       ON feedback.id = item.feedback
  INNER JOIN mdl_feedback_value AS value 
       ON item.id = value.item 
   WHERE item.typ = 'multichoicerated' AND item.feedback IN (43)
 ) AS a 
 INNER JOIN #myTempTable 
     on CONVERT(INT, CONVERT(VARCHAR(12), a.value)) = #myTempTable.num
 GROUP BY a.name, CONVERT(INT, CONVERT(VARCHAR(12), a.value)) ORDER BY a.name

 drop table #myTempTable

Je ne reçois pas cette erreur sans le dernier INNER JOIN

INNER JOIN #myTempTable on CONVERT(INT, CONVERT(VARCHAR(12), a.value))
= #myTempTable.num

Pourrais-tu m'aider s'il te plait? Je suis désespéré.

Merci.

22
ChangeTheWay

Afin d'éviter une telle erreur, vous pouvez utiliser CASE + ISNUMERIC pour gérer les scénarios où vous ne pouvez pas convertir en int.
Changement

CONVERT(INT, CONVERT(VARCHAR(12), a.value))

À

CONVERT(INT,
        CASE
        WHEN IsNumeric(CONVERT(VARCHAR(12), a.value)) = 1 THEN CONVERT(VARCHAR(12),a.value)
        ELSE 0 END) 

En gros, cela signifie que si vous ne pouvez pas me convertir en int, affectez une valeur de 0 (dans mon exemple)

Vous pouvez également consulter cet article sur la création d’une fonction personnalisée qui vérifiera si a.value est le numéro: http://www.tek-tips.com/faqs.cfm?fid=642

41
Milen

Etant donné que vous ne convertissez que vers ints pour ensuite effectuer une comparaison, je changerais simplement la définition de la table pour utiliser varchar également:

Create table #myTempTable
(
num varchar(12)
)
insert into #myTempTable (num) values (1),(2),(3),(4),(5)

et supprimez toutes les tentatives CONVERTs du reste de la requête.

 SELECT a.name, a.value AS value, COUNT(*) AS pocet   
 FROM 
 (SELECT item.name, value.value 
  FROM mdl_feedback AS feedback 
  INNER JOIN mdl_feedback_item AS item 
       ON feedback.id = item.feedback
  INNER JOIN mdl_feedback_value AS value 
       ON item.id = value.item 
   WHERE item.typ = 'multichoicerated' AND item.feedback IN (43)
 ) AS a 
 INNER JOIN #myTempTable 
     on a.value = #myTempTable.num
 GROUP BY a.name, a.value ORDER BY a.name
4
Damien_The_Unbeliever

Si vous convertissez un varchar en entier, assurez-vous de ne pas avoir de décimale.

Par exemple, si vous convertissez un champ varchar avec la valeur (12345.0) en entier, vous obtenez cette erreur de conversion. Dans mon cas, j'avais tous les champs avec .0 comme fin, j'ai donc utilisé l'instruction suivante pour résoudre globalement le problème.

CONVERT(int, replace(FIELD_NAME,'.0',''))
2
Arima