Ошибка конверсии при преобразовании значения 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
Не могли бы вы мне помочь? Я в отчаянии.
Спасибо.
Ответы
Ответ 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',''))