将varchar转换为数字噩梦

时间:2019-05-08 21:02:23

标签: sql sql-server

我想把这个问题扔给团队,因为我对此感到困惑。任何建议,将不胜感激。

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

此错误通常表示该列中必须有一个不能完全转换为NUM的值-例如:“ Y”。除非在这种情况下,否则数字就是什么,即使数据库认为数字值也不是。

我通过一次发布一列缩小了问题列的范围。奇怪的是,我可以将问题列放到FLOAT,然后放到NUMERIC。这可能是一个解决方案,但我担心将FLOAT与货币一起使用,当您将小数点后两位放在小数时,我不认为FLOAT会以相同的数字四舍五入。但是我可能会弄错了,使用FLOAT完全可以。

只是为了测试,我尝试了INT,而当我尝试以CAST AS INT进行转换时,出现了更具体的错误。 将varchar值'1823.33'转换为数据类型int时,转换失败。

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

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]

1 个答案:

答案 0 :(得分:2)

请确保...

这非常有效:

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

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