【问题标题】:Issue with data conversion - Conversion failed when converting the varchar value '0.0' to data type int数据转换问题 - 将 varchar 值“0.0”转换为数据类型 int 时转换失败
【发布时间】:2020-03-22 20:27:27
【问题描述】:

这是一个更大的存储过程,它应该接受用户加载的一批包装数据(即包装尺寸),如果只提供英制单位数据,它会计算并填充公制单位的尺寸,反之亦然。下面是高度计算的示例(我只是粘贴,因为对于每个维度,结构都是相同的,只有数字不同)。但是我一直收到错误:

消息 245,级别 16,状态 1 ---
将 varchar 值 '0.0' 转换为数据类型 int 时转换失败

我想补充一点,加载文件中没有 0.0 形式的数据,所以我假设这是来自 null,这就是为什么我尝试使用强制转换和 nullif 来处理这些数据。

select [Product ID] as [Product ID],
    [ID] as [PackRecordID],
    case when isnumeric([Height (Imperial)])= 1  and ([Height (Metric)] is null or [Height (Metric)] = '')    then
       case when [Height UOM (Imperial)] = 'FT' then nullif(try_cast((try_cast(isnull([Height (Imperial)],0) as numeric)*0.3048) as varchar(20)),0)
          when [Height UOM (Imperial)] = 'IN' then nullif(try_Cast((try_cast(isnull([Height (Imperial)],0)as numeric)*2.54) as varchar(20)),0)
          when [Height UOM (Imperial)] = 'YD' then nullif(try_Cast((try_cast(isnull([Height (Imperial)],0)as numeric)*0.9144) as varchar(20)),0) else  nullif(try_cast((try_cast(isnull([Height (Metric)],0) as numeric)*1)as varchar(20)),0) end 
                   else  nullif(try_cast((try_cast(isnull([Height (Metric)],0) as numeric)*1)as varchar(20)),0)
                   end as [Height (Metric)], 

   case when [Height UOM (Imperial)] = 'FT'and ([Height UOM (Metric)] is null or [Height UOM (Metric)] = '') then 'm'
           when [Height UOM (Imperial)] = 'IN' and ([Height UOM (Metric)] is null or [Height UOM (Metric)] = '') then 'cm'
                 when [Height UOM (Imperial)] = 'YD' and ([Height UOM (Metric)] is null or [Height UOM (Metric)] = '') then 'm'  else try_cast([Height UOM (Metric)]as varchar(max)) end as [Height UOM (Metric)]

【问题讨论】:

  • 一种选择是先转换为货币(例如),然后再转换为 int Select try_convert(int,try_convert(money,'0.0'))
  • 我认为归结为你在做nullif(varcharValue, 0)。尝试改用nullif(varcharValue, '0')
  • 嗨 Viviansuarez!只是好奇,有没有理由将它转换为 varchar?为简化起见,我将其保留为数字。比如像这样[Height UOM (Imperial)] = 'FT' then nullif(try_cast((try_cast(isnull([Height (Imperial)],0) as numeric)*0.3048)...
  • 嗨凯瑟琳!我将它转换为 varchar,因为我在将它放入带有 UOM(它们是 varchar)的临时表中时一直遇到问题,脚本从中获取新值,然后更新 pre-staging 表中的批处理(即表用户加载文件中的数据被放置在哪里进行处理)。当然,这是在我向主脚本添加一些其他内容之前,所以这可能不再是问题,我可以按照你的建议简化它。 :)

标签: sql-server sqldatatypes


【解决方案1】:

每种情况下最外层的nullif 函数-when 块尝试将varchar 值强制转换为int 以匹配其第二个参数。尝试使用nullif(varcharValue, '0') 代替nullif(varcharValue, 0),即:

create table dbo.Product
(
    [ID] int not null,
    [Product ID] int not null,
    [Height UOM (Imperial)] varchar(2),
    [Height (Imperial)] varchar(20),
    [Height UOM (Metric)] varchar(2),
    [Height (Metric)] varchar(20),
);

insert dbo.Product values
    (1, 1, 'FT', '1.0', null, null),
    (2, 2, 'IN', '2.0', null, null),
    (3, 3, 'YD', '3.0', null, null),
    (4, 4, null, null, 'MM', '4.0');

select
    [Product ID],
    [ID] as [PackRecordID],
    case
    when isnumeric([Height (Imperial)])=1 and ([Height (Metric)] is null or [Height (Metric)] = '') then
      case
        when [Height UOM (Imperial)]='FT' then nullif(try_cast((try_cast(isnull([Height (Imperial)],0) as numeric)*0.3048) as varchar(20)),'0')
        when [Height UOM (Imperial)]='IN' then nullif(try_Cast((try_cast(isnull([Height (Imperial)],0) as numeric)*2.54) as varchar(20)),'0')
        when [Height UOM (Imperial)]='YD' then nullif(try_Cast((try_cast(isnull([Height (Imperial)],0) as numeric)*0.9144) as varchar(20)),'0')
        else nullif(try_cast((try_cast(isnull([Height (Metric)],0) as numeric)*1) as varchar(20)),'0') end
    else nullif(try_cast((try_cast(isnull([Height (Metric)],0) as numeric)*1) as varchar(20)),'0')
    end as [Height (Metric)],

    case
   when [Height UOM (Imperial)]='FT' and ([Height UOM (Metric)] is null or [Height UOM (Metric)] = '') then 'm'
   when [Height UOM (Imperial)]='IN' and ([Height UOM (Metric)] is null or [Height UOM (Metric)] = '') then 'cm'
   when [Height UOM (Imperial)]='YD' and ([Height UOM (Metric)] is null or [Height UOM (Metric)] = '') then 'm'
   else try_cast([Height UOM (Metric)] as varchar(max))
   end as [Height UOM (Metric)]
from dbo.Product;

返回:

Product ID  PackRecordID  Height (Metric)  Height UOM (Metric)
1           1             0.3048           m
2           2             5.08             cm
3           3             2.7432           m
4           4             4                MM

【讨论】:

    猜你喜欢
    • 2011-12-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多