首页 > 解决方案 > 将 varchar 转换为数字噩梦

问题描述

我想把这个扔给团队,因为我被这个难住了。任何建议,将不胜感激。

我正在加载一个表,其中包含另一个表中的数据,在此过程中,数据类型从 VARCHAR 更改为 NUMERIC。我收到一个错误:将数据类型 varchar 转换为数字时出错。

此错误通常表明该列中必须有一个根本无法转换为 NUM 的值——例如:'Y'。除了在这种情况下,除了数值之外什么都没有,即使数据库认为它们不是。

我通过一次投射一列来缩小问题列的范围。奇怪的是我可以将问题列转换为 FLOAT,然后转换为 NUMERIC。这可能是一个解决方案,但我担心将 FLOAT 与货币一起使用,我认为当您有几个小数位时,FLOAT 不会将相同的 NUMERIC 舍入。但是我可能弄错了,使用 FLOAT 完全没问题。

只是为了测试,我尝试了 INT,当我尝试 CAST AS INT 时,我得到了一个更具体的错误。将 varchar 值“1823.33”转换为数据类型 int 时转换失败。

因此,当我运行以下查询时,一切似乎都可以正常工作……</p>

SELECT     
  [Expended]
  ,CAST([Expended] AS FLOAT) AS Exp_FLOAT
  ,CAST(CAST([Expended] AS FLOAT) AS NUMERIC (18,4)) AS Exp_NUM
FROM [Stage].[BI_FACT_SPENDPLAN_C]
where [Expended] ='1823.33'
Expended      Exp_FLOAT     Exp_NUM
1823.33       1823.33       1823.3300
1823.33       1823.33       1823.3300
1823.33       1823.33       1823.3300
1823.33       1823.33       1823.3300
1823.33       1823.33       1823.3300

我想我要问的是:您认为我应该 CAST AS FLOAT 然后 CAST AS NUMERIC 还是 SPENDPLAN 导出文件中的以下 9 列有重要意义?然后它引出了一个问题,如果我用双 CAST “修复”这些列,它是否会发生在另一列上并在表加载时失败?

SELECT     
    [Expended]       
    ,[Obligated]     
    ,[Total_Expended]      
    ,[Total_Obligated_FAMIS] 
    ,[Spendplan_Balance] 
    ,[Pending_Expenditures] 
    ,[Unexpended_Balance]
    ,[Funds_Remaining_by_BBFY]
    ,[PY_Funds_Remaining]
FROM [Stage].[BI_FACT_SPENDPLAN_C]

标签: sqlsql-server

解决方案


只是要确定...

这完美地工作:

declare @expended varchar(100)='1823.33'
select convert(numeric,@expended)

您完全确定您的问题确实与该记录有关吗?


推荐阅读