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.
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
Etant donné que vous ne convertissez que vers int
s 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 CONVERT
s 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
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',''))