Проблема здесь двоякая:
- Вы хранения числовых значений в виде текста
- Вы не проверки ввода в этом столбце текста
Ваш комментарий говорит ваше значение хранится вот так: - 5.862
, а не вот так: -5.862
.
Так вот некоторые SQL попробовать:
select convert(decimal, '-5.862')
select convert(decimal, '- 5.862')
уведомление о том, что первый «работает» (но позволяет вернуться к этому), то второй бросает это исключение.
реальный ответ здесь, чтобы не хранить числовые значения в виде текста, но вместо того, чтобы хранить их в надлежащем числовой тип данных, чтобы начать с. Если это не указано, не менее проверьте правильность ввода, убедившись, что вы не разрешаете нечисловые значения, ползущие в базу данных в этом столбце, например, не позволяя пробелам между знаками минус и числом.
НЕ допускайте попадания плохих данных в ваш стол. Вы не сохраняете любой работа, делая это. Валидация и исправления, которые необходимо выполнить для того, чтобы ваши существующие данные могли работать, намного лучше размещены в точке, где данные поступают в вашу таблицу.
А «быстрое решение» сродни просто держать штаны тепло это:
select convert(decimal, replace('- 5.862', ' ', ''))
Но это просто отодвигает проблему, пока кто-то не входит в это:
-5,862
twenty
!27
т.е.. что-то еще, что невозможно преобразовать. Поскольку вы храните их в виде текста, вам необходимо выполнить всю работу по исправлению плохих значений , где вы используете их вместо , где они отправляются.
Однако есть еще одна проблема, как предложено другими здесь, и это то, что DECIMAL
по умолчанию не допускает никаких цифр после десятичной точки, поэтому тот, который работает выше, производит только -6
.
Чтобы исправить , что проблему, указать точность:
select convert(decimal(18, 5), '-5.862')
Однако, и я не могу сказать, что это достаточно сильно: не хранить числовые значения в виде текста. Это катастрофа, ожидающая вас (что вы уже поняли).
Почему вы храните числовые значения в текстовом столбце? –
Можете ли вы попробовать это и рассказать мне, что вы вернете: 'select convert (varchar (10), -5.862)'. Кроме того, можете ли вы попытаться заменить точку запятой в столбце и посмотреть, удаляет ли эта проблема? Обратите внимание, что вам все равно нужно указывать точность при использовании 'DECIMAL', но давайте сначала сосредоточимся на исключении. –
Я получил результаты как -5.862 – Bishu