试图将NVARCHAR列值转换为DECIMAL(10,2)

时间:2019-05-14 21:29:36

标签: sql-server tsql

当我尝试转换表中特定列中的所有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 个答案:

答案 0 :(得分:1)

您确定替换$后的值都是数字吗?我曾经遇到过这种情况,必须先进行一些数据清理,然后才能进行更新。就我而言,其中一行中有一个空格,所以它失败了。我修好唱片后,一切正常。

您没有指定正在运行的sql,但是如果您使用的是Microsoft SQL,我将使用isnumeric进行检查并确认没有任何内容返回为false:

SELECT id, ISNUMERIC(REPLACE(DemandAmount,'$','')) as DemandAmt
    FROM dbo.CMS_BI_Demand
    WHERE BISysID = 1 AND ISNUMERIC(REPLACE(DemandAmount,'$','')) = 0

答案 1 :(得分:0)

不同的区域性具有不同的小数点和千位分隔符。调用CONVERT时,服务器将使用通过LANGUAGE设置指定的语言环境来尝试解析字符串。最好的情况是,如果字符串和语言环境不匹配,则会出现错误。最糟糕的情况是将使用错误的分隔符传递字符串。

鉴于$符号,看来您正在尝试在非美国语言环境中解析美国风格的数字字符串。解决方案是将PARSETRY_PARSEen-us用作区域性:

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

如果先解析为货币,则可以避免修剪货币符号:

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

不要尝试替换分隔符。这可能容易导致错误的值,并且 still 无法解析文本。如果值为2,345.123怎么办?即使您删除了千位分隔符,尝试转换此值(例如在德国)也会产生2345123.00

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

返回:

2345123.00

您可能会认为这在生产中不会发生。 EUR / USD汇率如何?在意大利?

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

------
112.00

糟糕

答案 2 :(得分:0)

要确定您的SQL SERVER实例不能正确转换为decimal(10,2)的值,请使用以下方法:

SELECT DemandAmount
FROM dbo.CMS_BI_Demand
WHERE TRY_CONVERT(DECIMAL(10,2), REPLACE(REPLACE(DemandAmount,'$',''),',','')) IS NULL