在sqlserver脚本中选择all时,将数据类型varchar转换为float时出错

时间:2018-04-09 07:03:29

标签: sql-server

我正在尝试运行以下查询,但是它返回记录然后在大约1000条记录停止后显示此错误将数据类型varchar转换为浮动消息。我该如何解决这个问题?

select * from
[storagedb - baw].dbo.nonres1 nr
join [storagedb - baw].[dbo].[BAW_AllSources_Stage1] ba
on nr.CSTMR_GRP_KEY2 = ba.Customer_CIS

3 个答案:

答案 0 :(得分:0)

根据您撰写的有关数据类型的评论,可能的解决方案是:

select * from
[storagedb - baw].dbo.nonres1 nr
join [storagedb - baw].[dbo].[BAW_AllSources_Stage1] ba
  on CAST(nr.CSTMR_GRP_KEY2 AS varchar(400)) = ba.Customer_CIS

OR:

select * from
[storagedb - baw].dbo.nonres1 nr
join [storagedb - baw].[dbo].[BAW_AllSources_Stage1] ba
  on nr.CSTMR_GRP_KEY2 = TRY_CAST(ba.Customer_CIS AS float)

注意:,您需要使用SQL Server 2012或更高版本的第二个查询。

基本上发生的事情是来自Customer_CIS的所有内容都试图隐式转换为float,但是那里的某些值根本无法转换。

如果您期望所有数据都可以转换,为了深入了解哪些值是问题,假设您拥有SQL Server 2012或更新版本,您将在下一个查询中获得令人不安的值:

SELECT *
FROM [storagedb - baw].[dbo].[BAW_AllSources_Stage1]
WHERE TRY_CAST(Customer_CIS AS float) IS NULL;

答案 1 :(得分:0)

您必须在表中找到不可转换为float数据类型的值。试试这个 -

select *
from [storagedb - baw].[dbo].[BAW_AllSources_Stage1]
where TRY_CONVERT(float, Customer_CIS) is null

答案 2 :(得分:0)

通过将FLOAT加入VARCHAR,SQL服务器希望将苹果与苹果进行比较,因此将VARCHAR隐式转换为FLOAT。

但是当该VARCHAR列包含无法转换为FLOAT的值时,它将引发如下错误:

Error converting data type varchar to float.

因此,要明确转换,请更改JOIN子句,以便将apple与apples进行比较。

可以使用TRY_CONVERTTRY_PARSE进行此操作 如果尝试转换失败,则TRY将返回NULL。

select * from
[storagedb - baw].dbo.nonres1 nr
join [storagedb - baw].[dbo].[BAW_AllSources_Stage1] ba
on nr.CSTMR_GRP_KEY2 = TRY_CONVERT(float,ba.Customer_CIS)

简化的测试片段:

declare @T table (id int identity(1,1) primary key, col_float float, col_varchar varchar(400));

insert into @T (col_float, col_varchar) values (1,'1'),(2,'two'),(0,''),(null,null);

select *, 
try_convert(float, col_varchar) as col_varchar_convert_to_float,
try_parse(col_varchar as float) as col_varchar_parse_as_float
from @T t
where col_float = try_convert(float, col_varchar);