【问题标题】:SQL Server: error converting data type nvarchar to floatSQL Server:将数据类型 nvarchar 转换为浮点数时出错
【发布时间】:2017-03-15 01:23:44
【问题描述】:

我已经阅读了很多文章并尝试了几种方法但没有任何运气。

我正在导入表 A(其成本为 char 到表 B(需要 float)。

我尝试了什么:

 --cast([Cost]   as float)
 -- cast(ISNULL([Cost],0)   as float)
 -- NULLIF(CAST(ISNULL([Cost],0)   as float), 0)
 convert(float,replace([Cost],',','') )[Cost]

样本数据

FINAL Freight Cost
1248
1248
193.79
201.56
1475.71
97.86
97.86
97.86
125.49
97.86
447.83
450
492.99
450

我仍然收到此错误:

将数据类型 nvarchar 转换为浮点数时出错

更新:

另外,我不确定如何根据答案修改现有代码;

现有的代码结构

1. creat table B
2. insert into B () select[DestAddress], [COST] from A

我也试过CAST(test AS FLOAT) AS CastedValue


为什么是float?数据集将被发送到需要float 的优化算法。感谢您指出这一点。

【问题讨论】:

  • 不替换点试试?
  • 将 [FINAL Freight Cost] 替换为 LTRIM(RTRIM([FINAL Freight Cost]))
  • 用你自己的话说你想做什么?
  • 我的猜测是您的源中有一行具有一些实际上不是有效数字的值。当人们将数字存储为字符时,这种情况很常见。
  • @Shnugo 试过了。 100k 行中有一个“n/a”。解决了。谢谢!!!!!!

标签: sql sql-server tsql types casting


【解决方案1】:

这对我有用吗?

DECLARE @tbl TABLE(test NVARCHAR(100));
INSERT INTO @tbl VALUES
 ('1248')
,('1248')
,('193.79')
,('201.56')
,('1475.71')
,('97.86')
,('97.86')
,('97.86')
,('125.49')
,('97.86')
,('447.83')
,('450')
,('492.99')
,('450');

SELECT *
     ,CAST(test AS FLOAT) AS CastedValue
FROM @tbl;

但主要问题是:为什么?

提示 1:Float 是错误的类型!

根据我的列名,您正在处理成本FLOAT 类型在这里绝对要避免!您应该使用 DECIMAL 或专门的类型来涵盖货币或货币价值...

提示 2:NVarchar 是错误的类型!

下一个问题又是:为什么?为什么这些值存储为NVARCHAR?如果可能的话,你应该在这里解决你的问题......

更新

你编辑了你的问题并添加了这个

insert into B () select[DestAddress], [COST]

我不知道目标表的列名,但这应该可行

INSERT INTO B(ColumnForAddress,ColumnForCost)
SELECT CAST([COST] AS FLOAT),[DestAddress] FROM YourSourceTable

更新 2

在您的所有 cmets 之后,我很确定您的数字列表中存在无效值。使用 ISNUMERIC 或 - 如果您使用的是 SQL-Server-2012+,则更好的是 TRY_CAST 来查找无效值。

【讨论】:

  • 这必须存储为float,因为它将被发送到优化算法中。该数据库由其他人存储。
  • 那么您的实际问题在哪里?所有提供的数字似乎都正确投射?
  • 您的代码正在运行,但我不确定如何针对现有代码进行修改。现有代码 1.create a table 2.insert into xxx() select * from.
  • 我正在将数据库A导入数据库B(需要float),但由于类型转换问题而失败。
  • @JohnHass 这是您应该在问题中提到的内容。请添加相关代码...应该像INSERT INTO tbl(TargetColumn, OtherColumn1,OtherColumn2) SELECT CAST(SourcColumn AS FLOAT),OtherColumn1,OtherColumn2 FROM SourcTable一样简单。可能还有更多列,简单的星号* 很棘手...
【解决方案2】:

使用Convert函数,加空格也能流畅运行,所以不用LtrimRtrim

例子:

select convert(float,' 492.99    ') + 1 as converted

结果:

Converted
---------
493.99

【讨论】:

  • 其实我试过convert(float,replace([Cost],',','') )[Cost]
【解决方案3】:
FORMAT(ROUND(cast(Total as float), 2), 'C') AS GrandTotal 

【讨论】:

  • 欢迎来到stackoverflow。除了您提供的答案之外,请考虑提供一个简短说明,说明为什么以及如何解决此问题。
猜你喜欢
  • 2017-03-23
  • 2012-02-26
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2016-01-20
相关资源
最近更新 更多