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

时间:2017-06-05 20:55:01

标签: sql sql-server-2008

我想将nvarchar数据转换为float类型。

在我的情况下,我有SalesValue列,我使用了这个命令

UPDATE Overseas 
SET SalesValue = CONVERT(FLOAT, REPLACE([SalesValue],',','') )

我的表格有

之类的值
201.01
40.50
215.12
550
304.201

但是我收到了错误

  

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

我该如何解决这个问题?

4 个答案:

答案 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