Ошибка преобразования типа данных nvarchar в реальный - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужно вычесть два значения nvarchar и сохранить результат в другом столбце. Я понимаю, что сначала мне нужно преобразовать nvarchar в числовые значения c, но я всегда получаю эту ошибку

Ошибка преобразования типа данных nvarchar в вещественный

Просто упомянуть в VARCHAR значения хранятся только цифры c значения, но я не могу понять, как это преобразование правильно.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

используйте инструкцию case. Это должно быть что-то вроде (t- sql псевдокод внутри SELECT)

case when IsNumeric(column1) AND IsNumeric(column2) 
     then cast(column1 as decimal) - cast(column2 as decimal) 
else NULL end as column3

Это классический пример того, почему вы не должны смешивать типы (в данном случае nvarchar и decimal), есть всевозможные шананиганы - как ('ab c' - 5) или (NULL - NULL) или ('Five' - '3'). Если это работает, было бы неплохо посмотреть на результаты «NULL», поскольку это может дать вам ценную информацию о том, какой вид мусора собирается в вашей системе.

0 голосов
/ 19 февраля 2020

Вы сказали, что ...

Просто чтобы упомянуть, в значениях varchar хранятся только числовые значения c, но я не могу понять, как правильно преобразовать.

Если это абсолютно верно, то существует очень высокая вероятность того, что в элементах, вызывающих ошибки, есть 1 или 2 конечных контрольных символа (Tab, Возврат каретки, Перевод строки и т. Д.).

Попробуйте преобразовать значения NVARCHAR для типа данных MONEY сначала. Это не будет работать для ведущих контрольных символов, но будет работать для конечных контрольных символов. Конечно, ваше первоначальное значение не может содержать более 4 десятичных знаков.

0 голосов
/ 18 февраля 2020

Это похоже на SQL Ошибка сервера. Если это так, используйте try_convert():

select try_convert(real, string_col)

Это возвращает NULL вместо ошибки, если есть проблемы с преобразованием.

Вы можете найти ошибочные значения, используя:

select string_col
from t
where try_convert(real, string_col) is null and
      string_col is not null;
...