2013-07-17 2 views
0

Я получаю сообщение об ошибке при попытке конвертировать varchar в decimal.SQL Server: ошибка при преобразовании varchar в decimal/float

Я нашел место ошибки, но не смог ее исправить.

код я использую:

SELECT 
    CONVERT(DATETIME, dbo.PAYMENTS.recdate, 3) AS rdate, 
    CONVERT(DECIMAL, dbo.PAYMENTS.amount), 
    dbo.PAYMENTS.balance 
FROM 
    dbo.PAYMENTS 

Я получил сообщение об ошибке:

Ошибка преобразования типа данных VARCHAR в числовой.

Ошибка возникает из-за значения -5.862, которое находится в столбце amount.

Я пытаюсь изменить значение -5.862 на 5, после чего оно работает правильно.

Любой, пожалуйста, помогите мне конвертировать varchar в decimal со значением -5.862

Спасибо.

+1

Почему вы храните числовые значения в текстовом столбце? –

+0

Можете ли вы попробовать это и рассказать мне, что вы вернете: 'select convert (varchar (10), -5.862)'. Кроме того, можете ли вы попытаться заменить точку запятой в столбце и посмотреть, удаляет ли эта проблема? Обратите внимание, что вам все равно нужно указывать точность при использовании 'DECIMAL', но давайте сначала сосредоточимся на исключении. –

+0

Я получил результаты как -5.862 – Bishu

ответ

3

Проблема здесь двоякая:

  1. Вы хранения числовых значений в виде текста
  2. Вы не проверки ввода в этом столбце текста

Ваш комментарий говорит ваше значение хранится вот так: - 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') 

Однако, и я не могу сказать, что это достаточно сильно: не хранить числовые значения в виде текста. Это катастрофа, ожидающая вас (что вы уже поняли).

+0

Спасибо вам большое за вашу помощь и предложение. Но я работаю с кем-то из базы данных, и я не уполномочен ничего менять на нем. Я могу только читать данные. Еще раз спасибо за вашу помощь. – Bishu

Смежные вопросы