Подтвердить что ты не робот

Ошибка конверсии при преобразовании значения varchar 'simple', в тип данных int

Я борюсь за несколько дней с этой проблемой, и я не могу понять, как я могу ее исправить.

Я хотел бы group by мою таблицу по значениям 1,2,3,4,5, поэтому я создал временную таблицу с этими значениями.

Теперь мне нужно ВХОДИТЬ В эту таблицу с другими таблицами на a.value = #myTempTable.num BUT a.value есть ntext, поэтому мне нужно КОНВЕРТИРОВАТЬ его, что я на самом деле делал, но я получаю сообщение об ошибке:

Conversion failed when converting the varchar value 'simple, ' to data type int. 

(в строке 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

Я не получаю эту ошибку без последней INNER JOIN

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

Не могли бы вы мне помочь? Я в отчаянии.

Спасибо.

4b9b3361

Ответ 1

Чтобы избежать такой ошибки, вы можете использовать CASE + ISNUMERIC для обработки сценариев, когда вы не можете преобразовать в int.
Изменить

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

To

CONVERT(INT, CASE WHEN IsNumeric(CONVERT(VARCHAR(12), a.value)) = 1 then CONVERT(VARCHAR(12), a.value) else 0 End) 

В основном это говорит, если вы не можете преобразовать меня в int присваивать значение 0 (в моем примере)

В качестве альтернативы вы можете посмотреть эту статью о создании настраиваемой функции, которая будет проверять, является ли a.value числом: http://www.tek-tips.com/faqs.cfm?fid=6423

Ответ 2

Учитывая, что вы только конвертируете в int, чтобы выполнить сравнение, я бы просто переключил определение таблицы вокруг на использование varchar также:

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

и удалите все попытки CONVERT из остальной части запроса.

 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

Ответ 3

Если вы конвертируете varchar в int, убедитесь, что у вас нет десятичных знаков.

Например, если вы конвертируете поле varchar со значением (12345.0) в целое число, вы получаете эту ошибку преобразования. В моем случае у меня были все поля с .0 как заканчивающиеся, поэтому я применил следующее выражение для устранения проблемы в глобальном масштабе.

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