Попытка преобразовать значение столбца NVARCHAR в DECIMAL (10,2) - PullRequest
0 голосов
/ 15 мая 2019

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

Вот ошибка:

Сообщение 8114, Уровень 16, Состояние 5, Строка 7
Ошибка преобразования типа данных nvarchar в числовой.

Вот мой код:

UPDATE dbo.CMS_BI_Demand 
SET DemandAmount = (SELECT CONVERT(DECIMAL(10, 2), REPLACE(DemandAmount, '$', '')) as DemandAmt
                    FROM dbo.CMS_BI_Demand
                    WHERE BISysID = 1)

Буду признателен за любую помощь / направление.

Вот мой код, который исправил ошибку:

UPDATE dbo.CMS_BI_Demand
SET DemandAmount = t1.DemandAmount
FROM (
    SELECT BISysID, CONVERT(DECIMAL(10,2), REPLACE(REPLACE(DemandAmount,'$',''),',','')) as DemandAmount
    FROM dbo.CMS_BI_Demand  
) t1
WHERE dbo.CMS_BI_Demand.BISysID = t1.BISysID;

Ответы [ 3 ]

1 голос
/ 15 мая 2019

Вы уверены, что все значения являются числовыми после замены $?Я столкнулся с этим один раз и должен был сделать некоторую очистку данных, прежде чем я смог сделать обновление.В моем случае в одном из рядов было место, поэтому это не удалось.Как только я исправил запись, все заработало.

Вы не указали, какой sql вы используете, но если вы используете Microsoft SQL, я бы запустил проверку с использованием isnumeric и проверил, что ничего не возвращается как ложное:

SELECT id, ISNUMERIC(REPLACE(DemandAmount,'$','')) as DemandAmt
    FROM dbo.CMS_BI_Demand
    WHERE BISysID = 1 AND ISNUMERIC(REPLACE(DemandAmount,'$','')) = 0
0 голосов
/ 15 мая 2019

Чтобы выяснить, какие значения ваш экземпляр SQL SERVER не может правильно преобразовать в decimal(10,2), используйте это:

SELECT DemandAmount
FROM dbo.CMS_BI_Demand
WHERE TRY_CONVERT(DECIMAL(10,2), REPLACE(REPLACE(DemandAmount,'$',''),',','')) IS NULL
0 голосов
/ 15 мая 2019

Разные культуры имеют разные десятичные и тысячи разделителей. При вызове CONVERT сервер будет использовать локаль, указанную в параметре LANGUAGE, чтобы попытаться проанализировать строку. В лучшем случае, если строка и локаль не совпадают, вы получите ошибку. В худшем случае строка будет передана с неверным разделителем.

Учитывая символ $, похоже, что вы пытаетесь проанализировать числовую строку в американском стиле за пределами США. Решение заключается в использовании PARSE или TRY_PARSE с en-us в качестве культуры:

select parse('234.5' as numeric(10,2) using 'en-us')

Вы можете избежать обрезки знака валюты, если сначала разберетесь с деньгами:

select parse('$234.5' as money using 'en-us')

НЕ попробуйте заменить разделители. Это может легко привести к неправильным значениям, а все же не сможет проанализировать текст. Что если значение было 2,345.123? Даже если вы удалите разделитель тысяч, попытка преобразовать это значение, например, в Германии, приведет к 2345123.00:

select parse('2345.123' as decimal(10,2) using 'de-DE')

Возвращает:

2345123.00

Вы можете предположить, что это не произойдет в производстве. Как насчет курса евро к доллару? В Италии?

SELECT PARSE('1.12' as decimal(10,2) using 'it-IT')

------
112.00

Oops

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...