SQL Server:将数据类型nvarchar转换为float时出错

时间:2016-11-01 20:18:06

标签: sql sql-server tsql types casting

我读过很多文章并试过几种方法,但没有运气。

我正在将表格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转换为float

时出错

更新

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

现有的代码结构

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

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

为什么float?数据集将被发送到需要float的优化算法。谢谢你指出了它。

3 个答案:

答案 0 :(得分:4)

这对我有用吗?

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

完成所有评论后,我非常确定您的号码列表中存在无效值。使用ISNUMERIC或 - 如果您使用SQL-Server-2012 +甚至更好TRY_CAST来查找无效值。

答案 1 :(得分:1)

使用Convert功能,即使添加空格也能顺利运行,因此无需使用LtrimRtrim

示例:

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

结果:

Converted
---------
493.99

答案 2 :(得分:-1)

FORMAT(ROUND(cast(Total as float), 2), 'C') AS GrandTotal