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



我正在尝试运行以下查询,但是它返回记录,然后在大约 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

根据您编写的有关数据类型的注释,可能的解决方案是:

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

或:

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的所有内容都试图隐式转换为浮点数,但您在其中的某些值根本无法转换。

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

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

您必须在表中查找不可转换为浮点数据类型的值。试试这个——

select *
from [storagedb - baw].[dbo].[BAW_AllSources_Stage1]
where TRY_CONVERT(float, Customer_CIS) is null
<</div> div class="one_answers">

通过将 FLOAT 连接到 VARCHAR,SQL 服务器想要将苹果与苹果进行比较,因此完成了 VARCHAR 到 FLOAT 的隐式转换。

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

Error converting data type varchar to float.

因此,要使转换显式,请更改 JOIN 子句,以便将苹果与苹果进行比较。

为此可以使用TRY_CONVERT或TRY_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);

相关内容

最新更新