当我尝试转换表中特定列中的所有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;
答案 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
设置指定的语言环境来尝试解析字符串。最好的情况是,如果字符串和语言环境不匹配,则会出现错误。最糟糕的情况是将使用错误的分隔符传递字符串。
鉴于$
符号,看来您正在尝试在非美国语言环境中解析美国风格的数字字符串。解决方案是将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')
不要尝试替换分隔符。这可能容易导致错误的值,并且 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