如何解决SQL Server中的转换错误?

时间:2017-08-19 17:18:57

标签: sql sql-server

请让我知道以下查询的问题我试图加入msg_id在某些情况下,邮件ID将是十六进制的,所以我转换为十进制并加入但是我收到此错误:

  

Msg 245,Level 16,State 1,Line 3
  将varchar值'e52b7ff2-0607-4b84-b326-7268af76f41d'转换为数据类型int时转换失败。

这是代码:

select * 
from ODS..RPL1 a 
left join SAP_T1..RPL1 b on a.Mobileno = b.Mobileno 
                         and a.Trans_ID = b.Trans_ID 
                         and (case 
                                 when charindex('-', a.msg_id) > 0 
                                    then a.MSG_ID 
                                 when ISNUMERIC(a.MSG_ID + 'e0') = 1 
                                    then a.MSG_ID  
                                 when ISNUMERIC(a.MSG_ID + 'e0') = 0 
                                      and CHARINDEX('-', a.msg_id) = 0 
                                    then CONVERT(int, CONVERT(VARBINARY, a.MSG_ID, 2)) end) =
                               (case 
                                   when charindex('-', b.msg_id) > 0 
                                      then b.MSG_ID 
                                   when ISNUMERIC(b.MSG_ID + 'e0') = 1 
                                      then b.MSG_ID  
                                   when ISNUMERIC(b.MSG_ID + 'e0') = 0 
                                        and CHARINDEX('-', b.msg_id) = 0 
                                      then CONVERT(int, CONVERT(VARBINARY, b.MSG_ID, 2)) end) 
where 
    a.msg_id = 'e52b7ff2-0607-4b84-b326-7268af76f41d'

1 个答案:

答案 0 :(得分:0)

你有这样的逻辑:

(case when charindex('-', a.msg_id) > 0
      then  a.MSG_ID
      when ISNUMERIC(a.MSG_ID + 'e0') = 1
      then a.MSG_ID
      when ISNUMERIC(a.MSG_ID + 'e0') = 0 and
           CHARINDEX('-', a.msg_id) = 0
      then CONVERT(int, CONVERT(VARBINARY, a.MSG_ID, 2))
 end)

case表达式只返回一种类型。在这种情况下,类型将是一个整数,因为这是最严格的(即转换规则的工作方式)。因此,返回msg_id将失败并转换为整数。

将显式转换添加回字符串将解决当前问题:

(case when charindex('-', a.msg_id) > 0
      then  a.MSG_ID
      when ISNUMERIC(a.MSG_ID + 'e0') = 1
      then a.MSG_ID
      when ISNUMERIC(a.MSG_ID + 'e0') = 0 and
           CHARINDEX('-', a.msg_id) = 0
      then CAST(CONVERT(int, CONVERT(VARBINARY, a.MSG_ID, 2)) as VARCHAR(255))
 end)

这是否符合您的要求还不清楚,因为您的问题没有明确说明。如果这样做不符合您的要求(但它确实修复了转换),那么请询问带有示例数据和所需结果的另一个问题。