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