我想将nvarchar
数据转换为float
类型。
在我的情况下,我有SalesValue
列,我使用了这个命令
UPDATE Overseas
SET SalesValue = CONVERT(FLOAT, REPLACE([SalesValue],',','') )
我的表格有
之类的值201.01
40.50
215.12
550
304.201
但是我收到了错误
SQL:将数据类型nvarchar转换为float时出错。
我该如何解决这个问题?
答案 0 :(得分:1)
您应该找到不匹配的值。在SQL Server 2012+中,您可以使用try_convert()
。那是不可用的。那么,这个怎么样?
SELECT SalesValue
FROM Overseas
WHERE SalesValue LIKE '%[^0-9,.]%' OR
SalesValue LIKE '%[.,]%[.,]%';
我认为这涵盖了明显的不规则性:一个不是数字或两个(或更多)小数点的字符。
答案 1 :(得分:0)
听起来我的数据仍然有一些非数字的东西。我希望您的应用程序方在输入之前在清理数据方面做得非常出色,问题可能是你有一个' $'在一个或多个领域。 如果你有一个非数字字符,那么强制转换就会失败。'。'在其中(因为你可能知道你删除',')的原因。 我运行了以下脚本来测试它。
declare @myFloat float;
declare @test1 nvarchar(10) = '145.88';
declare @test2 nvarchar(10) = '4,145.88';
declare @test3 nvarchar(10) = '$4,145.88';
SELECT ISNUMERIC(@TEST3)
set @myFloat = CONVERT(FLOAT, REPLACE(@test1,',','') );
select @myFloat;
set @myFloat = CONVERT(FLOAT, REPLACE(@test2,',','') );
select @myFloat;
--THIS WILL FAIL
set @myFloat = CONVERT(FLOAT, REPLACE(@test3,',','') );
select @myFloat;
--THIS WILL NOT FAIL
set @myFloat = CONVERT(FLOAT, REPLACE(REPLACE(@test3,',',''),'$','') );
select @myFloat;
您可以尝试在相关列上运行以下脚本,以查看您遇到问题的列:
--run this on your table
SELECT SalesValue
FROM Overseas
WHERE ISNUMERIC(REPLACE(SalesValue,',','')) = 0
--test sample
/*
insert into #myTable
values ('145.88'),
('4,145.88'),
('$4,145.88'),
('$4,145.88%');
SELECT *
FROM #myTable
WHERE ISNUMERIC(REPLACE(amounts,',','')) = 0
--WHERE ISNUMERIC(REPLACE(REPLACE(amounts,',',''),'$','')) = 0 --this will remove results with $ also
*/
因此,您的修复方法是简单地更改您提供的行:
UPDATE Overseas SET SalesValue = CONVERT(FLOAT, REPLACE(REPLACE([SalesValue],',',''),'$','') )
除非您在先前脚本的结果中找到其他字符。
答案 2 :(得分:0)
使用以下查询获得第一个投射值,然后正常更新
SELECT
case when ISNUMERIC([SalesValue])=1
then CAST([SalesValue] AS FLOAT) else 0 end AS CastedValue)
FROM your_table_name
答案 3 :(得分:0)
这会让你比ISNUMERIC()
declare @table table (SalesValue varchar(16))
insert into @table
values
('1e4'),
('$'),
('134.55'),
('66,9897'),
('14')
select
SalesValue
,case
when SalesValue NOT LIKE '%[^0-9,.]%'
then convert(decimal(16,4),replace(SalesValue,',','.'))
end
from
@table