我读过很多文章并试过几种方法,但没有运气。
我正在将表格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
的优化算法。谢谢你指出了它。
答案 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;
但主要问题是:为什么?
从我的专栏名称中,您正在处理费用。这里绝对要避免使用FLOAT
类型!您应该使用DECIMAL
或专门类型来支付货币或货币价值......
接下来的问题是:为什么?为什么这些值存储为NVARCHAR
?如果可能的话,你应该在这里解决你的问题......
您修改了问题并添加了
insert into B () select[DestAddress], [COST]
我不知道目标表的列名,但这应该有效
INSERT INTO B(ColumnForAddress,ColumnForCost)
SELECT CAST([COST] AS FLOAT),[DestAddress] FROM YourSourceTable
完成所有评论后,我非常确定您的号码列表中存在无效值。使用ISNUMERIC
或 - 如果您使用SQL-Server-2012 +甚至更好TRY_CAST
来查找无效值。
答案 1 :(得分:1)
使用Convert
功能,即使添加空格也能顺利运行,因此无需使用Ltrim
或Rtrim
!
示例:
select convert(float,' 492.99 ') + 1 as converted
结果:
Converted
---------
493.99
答案 2 :(得分:-1)
FORMAT(ROUND(cast(Total as float), 2), 'C') AS GrandTotal