Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:将数据类型nvarchar转换为浮点时出错_Sql_Sql Server 2008 - Fatal编程技术网

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

SQL:将数据类型nvarchar转换为浮点时出错,sql,sql-server-2008,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转换为浮点时出错 如何解决此问题?您应该找到不匹配的值。在SQL Server 2012+中,您可

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

在我的例子中,我有
SalesValue
列,我使用了这个命令

UPDATE Overseas 
SET SalesValue = CONVERT(FLOAT, REPLACE([SalesValue],',','') )
我的表有如下值

201.01
40.50
215.12
550
304.201
但我犯了个错误

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


如何解决此问题?

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

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

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

在我看来,您的数据仍然包含一些非数字的内容。我希望您的应用程序在输入数据之前能够很好地清理数据,问题可能是您的一个或多个字段中有“$”字符。 如果其中有一个除“.”以外的非数字字符,则强制转换将失败(您可能知道这就是删除“,”的原因)。 我运行下面的脚本来测试这个

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

除非您在上一个脚本的结果中找到其他字符。

使用下面的查询第一次转换值,然后正常更新

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

这将比
ISNUMERIC()更接近您


这些钱是多少?不建议首先使用FLOAT。使用十进制或货币。问题不在于你给出的十进制值。它将使用无法转换为小数的值(如美元符号$)。这些值都可以转换为浮点数据类型。选择CAST('201.01'作为浮动)选择CAST('40.50'作为浮动)选择CAST('215.12'作为浮动)选择CAST('550'作为浮动)选择CAST('304.201'作为浮动)还有别的事情吗?是的,钱prices@Tarzan我给你举个例子,我想把这个表中的所有数据转换成float@3mr . . . 您必须运行查询以找出错误值是什么。我照你说的做了,但我通常是从excel文件动态加载数据。。现在需要手动设置哪些坏值?@3mr。Excel不强制类型,所以任何东西都可以导入。所以我得到了错误的值。。然后呢?@3mr。我建议你问另一个问题,并显示失败的实际值。我没有像我说的那样在我的值中签$sign。。我从excel表格中得到数据,我想这就是问题所在。用科学符号检查代码。。。i、 e.
'1e4'
as@testI同意scsimon的意见。Excel试图通过基于列数据采样确定数据类型来“帮助”。在我的工作中,我有一个SSIS包,用于查看excel文档中的单元格。我在testing and prod中发现,当工作簿没有为所有单元格预格式化为“文本”时,或者如果您从另一个源复制和粘贴(编码问题),我的包将无法正确读取数据@3mr todo:获取一个空白工作簿,选择“全部”,将单元格格式化为文本,粘贴到数据中,然后重试。@3mr,您是否运行过脚本来检查数据中是否有非数字行?选择SalesValue作为[BAD VALUE],*FROM Overseas is numeric(替换(SalesValue,',','')=0在
SalesValue='$'
SalesValue='1e4'
中测试代码。你的方法是有缺陷的,你会从阅读和它的基础参考中受益。
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