我不得不创建第二个标题行,并使用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."
非常感谢任何帮助。
答案 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转换为数字时出错。
...这是有道理的,因为你试图将一个字符串(标题)与一个十进制字段混合。
所以你有两个选择:
varchar(n)
。在你的情况下,这意味着像这样添加演员:
,'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需要选择合适的长度。