【问题标题】:Why does SUM(real) return a float datatype in SQL Server?为什么 SUM(real) 在 SQL Server 中返回浮点数据类型?
【发布时间】:2012-10-12 20:28:46
【问题描述】:

如果我有这样的表:

物品

Name varchar(50)
Value real

然后我创建一个视图:

select sum(Value) as ValueSum from Items

ValueSum 数据类型是一个浮点数。为什么它不再是真正的数据类型?

另外,这在 SQL Server 2005 和 2008 之间是否发生了变化?我有一个旧的数据库备份,其中视图中的 ValueSum 作为真正的非浮点数返回。我可以恢复备份,如果我查看视图,它看起来像是在返回一个真实的,但如果重新保存它就会变成一个浮点数。

【问题讨论】:

  • 我对这些版本感到困惑。我的意思是 sql 2005 和 2008。我已经更新了问题。

标签: sql-server sqldatatypes


【解决方案1】:

real 只是float(24) 的同义词。参考:float and real (Transact-SQL)

当您对多个 reals(甚至其中 2 个)求和时,您可能会溢出 real 数据类型,因此它会被提升为更大的数据类型。

测试:

declare @t table (a real);
insert @t select 123;
select SQL_VARIANT_PROPERTY(sum(a), 'basetype'),
       SQL_VARIANT_PROPERTY(sum(a), 'precision'),
       SQL_VARIANT_PROPERTY(sum(a), 'scale')
from @t;

-------------
float    53    0

这与导致结果转到 (N)Varchar(MAX) 的某些字符串函数相同,这在 Common Table Expressions 中使用时很常见,需要显式 CAST 以消除表达式类型不等式错误。

【讨论】:

  • 现在我了解 sum(real) 返回浮点数。为什么,当我查看备份时,视图会返回实数吗?只有在我打开视图并重新保存后,它才会显示它返回浮点数。
  • 我在 SQL Server 2005 实例上运行了同样的事情,得到了同样的 float(53) 结果。
  • 感谢您的检查。我确信当我恢复数据库时,视图会说它们正在返回真实值,但我不知道这会如何发生。如果我打开它们并重新保存它们,那么它们确实会返回浮动。
猜你喜欢
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多