【发布时间】: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 表中的批处理(即表用户加载文件中的数据被放置在哪里进行处理)。当然,这是在我向主脚本添加一些其他内容之前,所以这可能不再是问题,我可以按照你的建议简化它。 :)