Как преобразовать значение varchar в десятичное? - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть столбец, который в настоящее время установлен как nvarchar(max), и я хочу преобразовать столбец в decimal(38,2).Проблема, с которой я сталкиваюсь, состоит в том, что несколько миллионов строк имеют формат -1.943E12, и из-за присутствия E появляется ошибка Cannot convert nvarchar into numeric, когда я пытаюсь преобразовать столбец в десятичное число.,Есть ли способ сделать это?

CREATE TABLE practice (cost nvarchar(max))
INSERT INTO practice values ('123'),('44232.99'),('43.4432'),('1.943E12')

SELECT CAST(cost as decimal(32,2)) FROM practice

В конечном итоге я пытаюсь вставить данные из промежуточной таблицы (где все столбцы nvarchar (max)) в таблицу с соответствующими типами данных.Я все время получал сообщение об ошибке, поэтому, покопавшись в каждом из 40 столбцов, я нашел 5 столбцов, в которых встречается эта научная запись.Любой совет, как сделать это в масштабе, не проверяя каждый столбец?

INSERT INTO practice_corrected_datatypes
SELECT * FROM practice

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

при условии, что у вас есть try_parse() и try_cast()

SELECT try_cast(try_parse(cost as float) as decimal(32,2))
FROM practice

Преимущество состоит в том, что они возвращают NULL вместо сбоя.Вы могли бы, вероятно, обойтись только с внутренним try_parse ()

SELECT cast(try_parse(cost as float) as decimal(32,2))
FROM practice
0 голосов
/ 27 сентября 2018

Попробуйте это ...

обновить p установить стоимость = приведение (приведение (стоимостное значение как число с плавающей запятой) как десятичное число (32,2)) из практики p, где стоимость похожа на '% E%'

0 голосов
/ 27 сентября 2018

Числовое значение не может быть преобразовано из экспоненциального формата, но число с плавающей запятой может.Следовательно, вы можете сделать это, используя функцию float.Например:

print cast(cast('1.943E12' as float) as decimal(38,2))
...