将varchar转换为int时出错

时间:2013-05-07 18:55:31

标签: sql sql-server-2008

SELECT b.*,
       a.jeopCodeId,
       a.JeopCodeDetail
FROM   storm_jeopinfo     a,
       storm_orders       b
WHERE  a.ordernumber IS NOT NULL
       AND a.ordernumber = b.order_number
       AND b.Installed_dt IS NOT NULL
       AND b.CUST_SIGN_DT BETWEEN CONVERT(date, '2012-06-01', 102) 
                              AND CONVERT(date, '2013-04-30', 102)
    UNION ALL
SELECT b.*,
       a.jeop_code,
       a.jeop_desc
FROM   storm_bpm_jeops     a,
       storm_orders        b
WHERE  b.order_number = a.Order_number
       AND b.srvc_order_unit = a.srvc_order_unit
  

错误消息:转换varchar值时转换失败   'JEOP-008'到数据类型int。

它继续与下一列的系列。无法成功执行此查询。

2 个答案:

答案 0 :(得分:1)

根据您的更新,您可能需要

CAST(SUBSTRING(a.jeop_code,6,3)as int)as jeopCodeId

或者你可能想要一个如下的联接。

但是,除非您告诉我们您想要做什么以及该表的业务规则,否则我无法确定。

SELECT b.*,
       a.jeopCodeId,
       a.JeopCodeDetail,
       a2.jeop_code,
       a2.jeop_desc
FROM   storm_orders       b
       join storm_jeepinfo a on a.ordernumber = b.order_number
       join storm_bpm_jeops a2 on a2.order_number = b.order_number 
                     and a2.srvc_order_unit = b.srvc_order_unit
WHERE  a.ordernumber IS NOT NULL -- is b.ordernumber ever null if no then this can go.
       AND b.Installed_dt IS NOT NULL
       AND b.CUST_SIGN_DT BETWEEN CONVERT(date, '2012-06-01', 102) 
                              AND CONVERT(date, '2013-04-30', 102)

问题:为什么storm_jeepinfo.ordernumber没有_?如果你的命名一致,可能会更好。这是最明显的新手错误。

错误的命名没有任何好处!


看起来你有一些错别字。请记住,在UNION中所有选择字段必须完全匹配...例如,在第一个选择中,您选择a.jeopCodeId,但在第二个选择中,您不需要输入ID并选择a.jeop_code - 它们显然是不兼容的数据类型。

我注意到A在两个select语句中都没有引用同一个表。某些字段可能不具备兼容类型。在这种情况下,您可以选择空字符串''0甚至是null,以查找您尝试合并的字段。

答案 1 :(得分:0)

SELECT b.*,
      cast (a.jeopCodeId as varchar (50)),
       a.JeopCodeDetail
FROM   storm_jeopinfo     a
JOIN       storm_orders       b
    ON a.ordernumber = b.order_number
WHERE  a.ordernumber IS NOT NULL
       AND b.Installed_dt IS NOT NULL
       AND b.CUST_SIGN_DT BETWEEN CONVERT(date, '2012-06-01', 102) 
                              AND CONVERT(date, '2013-04-30', 102)
UNION ALL
SELECT b.*,
       a.jeop_code,
       a.jeop_desc
FROM   storm_bpm_jeops     a
JOIN       storm_orders        b
    ON  b.order_number = a.Order_number
       AND b.srvc_order_unit = a.srvc_order_unit

请注意,我修复了不应该使用的隐式连接,因为它们在很多年前被更好的语法(更容易维护并且不太可能发生意外交叉连接)所取代。此外,Select *是一种非常差的技术,应该用字段列表替换。当你有一个联合时尤其如此,因为如果一个表改变而另一个表改变,它将会中断。此外,浪费网络和数据库资源来调用比您打算使用的列更多的列。