2017-06-05 146 views
1

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

在我来说,我有SalesValue列,我用这个命令

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

我的表中有值,像

201.01 
40.50 
215.12 
550 
304.201 

但我得到一个错误

SQL:错误转换数据类型nvarchar浮动。

我该如何解决这个问题?

+1

1日投值这些钱数额?不建议使用FLOAT开始。使用DECIMAL或MONEY。问题不在于你给出的十进制值作为例子。这将与无法转换为小数的值(如美元符号$)一起使用。 –

+0

这些值都可以转换为float数据类型。 SELECT CAST( '201.01' AS FLOAT) SELECT CAST('40 0.50' AS FLOAT) SELECT CAST( '215.12' AS FLOAT) SELECT CAST( '550' AS FLOAT) SELECT CAST( '304.201' AS FLOAT) – Tarzan

+0

还有其他事情吗? – Tarzan

回答

1

使用下面的查询,然后更新正常

SELECT 
      case when ISNUMERIC([SalesValue])=1 
      then CAST([SalesValue] AS FLOAT) else 0 end AS CastedValue) 
     FROM your_table_name 
+0

尝试您的代码,其中'SalesValue ='$''或'SalesValue ='1e4'' 。你的方法是有缺陷的,你会从阅读[这篇文章](https://stackoverflow.com/a/7400335/6167855)中受益,它是底层引用。 – scsimon

+0

@scsimon可以用编辑后的代码发布你的答案 – 3mr

1

您应该找到不匹配的值。在SQL Server 2012+中,您可以使用try_convert()。这是不可用的。那么,这个怎么样?

SELECT SalesValue 
FROM Overseas 
WHERE SalesValue LIKE '%[^0-9,.]%' OR 
     SalesValue LIKE '%[.,]%[.,]%'; 

我认为这涵盖了明显的不规则性:一个不是数字或两个(或多个)小数点的字符。

+0

你能写出完整的命令吗? – 3mr

+0

@ 3mr。 。 。您必须运行查询来找出错误的值。然后相应地处理它们。 –

+0

我做你说的,但我加载我的数据通常和动态从Excel文件..现在需要什么手动坏值在哪里? – 3mr

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],',',''),'$','')) 

除非您在前面的脚本结果中找到其他字符。

+0

我没有$登录我的值,因为我说..我从Excel表中获得了我的数据,我认为这是问题.. – 3mr

+0

用科学记数法检查您的代码...即''1e4''作为@test – scsimon

+0

我同意scsimon。 Excel试图通过基于列数据的采样来确定数据类型来“帮助”。在我的工作中,我有一个查看excel文档中单元格的SSIS包。我在测试中发现,当工作簿没有被预格式化为所有单元格的“文本”时,或者如果从另一个源复制并粘贴(编码问题),我的包将无法正确读取数据。 @ 3mr todo:获取空白工作簿,全选,将单元格格式化为文本,粘贴数据并重试。 – chris

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 
相关问题