Ik worstel al een paar dagen met dit probleem en ik weet niet hoe ik het kan oplossen.
Ik wil mijn tabel group by
op de waarden 1
,2
,3
,4
,5
dus ik heb een tijdelijke tabelgemaakt met deze waarden.
Nu moet ik INNER JOIN
deze tabel met andere tabellen op a.value = #myTempTable.num
.
MAAR a.value
is ntext
dus ik moet het CONVERT
wat ik eigenlijk deed, maar ik krijg een foutmelding:
p>
Conversie mislukt bij het converteren van de varchar-waarde ‘simple’ naar data
typ int. (op lijn 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
Ik krijg deze foutmelding niet zonder de laatste INNER JOIN
INNER JOIN #myTempTable on CONVERT(INT, CONVERT(VARCHAR(12), a.value))
= #myTempTable.num
Kun je me alsjeblieft helpen? Ik ben wanhopig.
Bedankt.
Antwoord 1, autoriteit 100%
Om een dergelijke fout te voorkomen, kunt u CASE
+ ISNUMERIC
gebruiken om scenario’s af te handelen waarin u niet kunt converteren naar int.
Wijzigen
CONVERT(INT, CONVERT(VARCHAR(12), a.value))
Naar
CONVERT(INT,
CASE
WHEN IsNumeric(CONVERT(VARCHAR(12), a.value)) = 1 THEN CONVERT(VARCHAR(12),a.value)
ELSE 0 END)
In feite zegt dit dat als je me niet kunt converteren naar int, een waarde van 0 toewijzen (in mijn voorbeeld)
Je kunt ook dit artikel bekijken over het maken van een aangepaste functie die controleert of a.value
een nummer is: http://www.tek-tips.com/faqs.cfm?fid=6423
Antwoord 2, autoriteit 10%
Als je een varchar naar int converteert, zorg er dan voor dat je geen decimalen hebt.
Als u bijvoorbeeld een varchar-veld met waarde (12345.0) converteert naar een geheel getal, krijgt u deze conversiefout. In mijn geval had ik al mijn velden met .0 als einde, dus ik gebruikte de volgende verklaring om het probleem globaal op te lossen.
CONVERT(int, replace(FIELD_NAME,'.0',''))
Antwoord 3, autoriteit 7%
Aangezien je alleen converteert naar int
s om vervolgens een vergelijking uit te voeren, zou ik de tabeldefinitie omschakelen naar het gebruik van varchar
ook:
Create table #myTempTable
(
num varchar(12)
)
insert into #myTempTable (num) values (1),(2),(3),(4),(5)
en verwijder alle pogingen tot CONVERT
s uit de rest van de zoekopdracht.
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