我在SQL Server 2008中尝试UNION All时遇到问题

时间:2015-07-26 21:39:32

标签: sql sql-server

我不得不创建第二个标题行,并使用Query的第一个记录来执行此操作。我使用UNION All创建此标头记录,使用UNION的第二部分来提取所需的数据。 我在一栏中有一个问题。

,'Active Energy kWh'

UNION ALL

,SUM(cast(invc.UNITS as Decimal (15,0)))

每一方都是联盟之前和之后的11行,我尝试了各种组合但总是会出现错误信息。

上面给了我"Error converting data type varchar to numeric."

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

错误消息表明INVC表UNITS列中的某个值是非数字值。我猜测它是一个字符串(VARCHAR或类似的)列或其他东西 - 并且其中一个值最终处于无法解析的状态。

不幸的是,除了检查表格的小范围以逐渐找到“坏”之外别无他法。行(即尝试一次运行几百万行的查询,然后减少数量,直到你回到坏数据上)。 SQL 2014如果你可以恢复数据库的话,它有TRY_CONVERT函数,它允许转换失败,支持更直接的检查 - 但你需要在另一个系统上使用它

(我假设此功能的升级到2014年是不可能的 - 您最好的选择可能只是正在寻找的坏行)。

答案 1 :(得分:1)

问题在于您尝试在单个查询中混合标题信息和数据信息。

显然,所有标题列都是字符串。但并非所有数据列都是字符串,并且当您以这种方式混合数据类型时,SQL Server会感到不快。

你在做什么等同于:

select 'header1' as col1 -- string
union all
select 123.5 -- decimal

上述查询产生以下错误:

  

将数据类型varchar转换为数字时出错。

...这是有道理的,因为你试图将一个字符串(标题)与一个十进制字段混合。

所以你有两个选择:

  1. 从查询中删除标题列,并处理查询之外的标题信息。
  2. 接受以下事实:您需要将每列的数据类型转换为字符串类型。因此,当您拥有数字数据时,您需要明确地将列投射到varchar(n)
  3. 在你的情况下,这意味着像这样添加演员:

    ,'Active Energy kWh'
    
    UNION ALL
    
    ,CAST(SUM(cast(invc.UNITS as Decimal (15,0))) AS VARCHAR(50)) -- Change 50 to appropriate value for your case
    

    编辑:根据评论反馈,将广告投放更改为varchar,使其具有明确的长度(varchar(n)),以避免依赖于默认长度,这可能是也可能是不够长。 OP知道数据,因此OP需要选择合适的长度。