操作数数据类型void类型对sum运算符无效

时间:2013-03-11 05:59:14

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我对使用null有疑问。

如果我运行此查询

SELECT SUM(x)
FROM (SELECT NULL AS x) AS DerivedTable

我收到错误消息

  

“操作数数据类型void类型对sum运算符无效。”

但是,如果我创建一个具有可空字段的表并在sum聚合中使用它,它将忽略NULL值并基本上将所有其余记录相加。

CREATE TABLE #temp1(x int)
insert into #temp values (NULL),(3),(5)

SELECT SUM(x) FROM #temp1 

结果是8。

这个有合理的解释吗? 是不是因为NULL的数据类型还没有在派生表的查询中声明但是用temp表声明了? 另外,我真的想知道从表或派生表运行时是否有办法产生此错误消息,就像第二个#temp1示例一样。从表或表表达式运行时产生此错误消息的任何示例都非常受欢迎。

谢谢大家

1 个答案:

答案 0 :(得分:12)

这确实是因为在派生表方案中无法推断类型的列

如果更改语句并在列上明确使用类型,则select将起作用。

SELECT SUM(x) FROM (SELECT CAST(NULL AS INTEGER) AS x) AS DerivedTable

以下可以推断出类型的语句

SELECT SUM(x) FROM (SELECT NULL AS x UNION SELECT 1) AS DerivedTable

SQL Fiddle


这也可以回答你的第二个问题。由于您无法在不声明类型的情况下创建表,因此无法生成会生成该特定错误消息的语句。