Conversie mislukt bij het converteren van de varchar-waarde ‘simple’ naar datatype int

Ik worstel al een paar dagen met dit probleem en ik weet niet hoe ik het kan oplossen.

Ik wil mijn tabel group byop de waarden 1,2,3,4,5dus ik heb een tijdelijke tabelgemaakt met deze waarden.

Nu moet ik INNER JOINdeze tabel met andere tabellen op a.value = #myTempTable.num.

MAAR a.valueis ntextdus ik moet het CONVERTwat 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+ ISNUMERICgebruiken 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.valueeen 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 ints om vervolgens een vergelijking uit te voeren, zou ik de tabeldefinitie omschakelen naar het gebruik van varcharook:

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

en verwijder alle pogingen tot CONVERTs 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

Other episodes