获取“将数据类型varchar转换为数字时出错”。即使转换后

时间:2019-01-16 20:22:35

标签: sql sql-server

我有一个简单的SQL查询

select top 100 
    pickticket_number,
    date_allocated,
    l2.action
from  
    [JMNYC-AMTDB].[AMTPLUS].[dbo].PickTickets P (nolock)
left join
    [A1Warehouse].[dbo].[RF_LOG2] (NOLOCK) l2 ON l2.PACKSLIP = p.PickTicket_Number

这似乎是一个简单的转换/广播问题,但是无论我尝试进行哪种转换或转换,我都会遇到相同的错误。

我已经尝试了以下所有

LEFT JOIN
    [A1Warehouse].[dbo].[RF_LOG2] (NOLOCK) l2 ON convert(numeric,l2.PACKSLIP) = p.PickTicket_Number

LEFT JOIN
    [A1Warehouse].[dbo].[RF_LOG2] (NOLOCK) l2 ON convert(numeric,l2.PACKSLIP) = convert(numeric, p.PickTicket_Number)

LEFT JOIN
    [A1Warehouse].[dbo].[RF_LOG2] (NOLOCK) l2 ON cast(l2.PACKSLIP as decimal(22,8)) = cast(p.pickticket_number as decimal(22,8)) 

但是,这些都不起作用,或者强制转换或转换的任何组合似乎都不起作用。有人知道我在做什么错吗?

2 个答案:

答案 0 :(得分:1)

您显然有无效的数据。您可以通过执行以下操作找到它:

select packslip
from [A1Warehouse].[dbo].[RF_LOG2]
where try_cast(l2.PACKSLIP as decimal(22,8)) is null and l2.PACKSLIP is not null;

对于您的查询,您可以使用try_cast()来避免该错误。但是,您应该查看数据中的实际问题是什么。

而且,您的外键关系应具有匹配的类型并正确声明。

答案 1 :(得分:1)

您似乎无法将数据转换为数字/十进制

广播/转换为varchar

select top 100 
    pickticket_number,
    date_allocated,
    l2.action
from  
    [JMNYC-AMTDB].[AMTPLUS].[dbo].PickTickets P (nolock)
left join
    [A1Warehouse].[dbo].[RF_LOG2] (NOLOCK) l2 ON cast(l2.PACKSLIP as varchar) = cast(p.PickTicket_Number as varchar)

然后对每个表进行故障排除,以查看该字段中的非数字字符

通过使用isnumeric