Sql server 2012 SQL Server隐式数据类型转换挑战

Sql server 2012 SQL Server隐式数据类型转换挑战,sql-server-2012,Sql Server 2012,在过去的20年里,我使用过许多数据库,只遇到过SQL Server这种“有趣”的隐式数据转换问题 如果我创建了一个包含一个小int列的表,并在其中插入两行值分别为1和2,然后运行以下查询“Select Avg(column)From table”我得到的是一个截断的结果,而不是1.5,这是我从地球上几乎任何其他数据库中得到的结果,它会自动升级数据类型以存储整个结果,而不是截断/舍入到列数据类型。现在我知道我可以在每种可能的情况下解决这个问题,但不是一个好的动态解决方案,特别是对于数据分析产品的数

在过去的20年里,我使用过许多数据库,只遇到过SQL Server这种“有趣”的隐式数据转换问题

如果我创建了一个包含一个小int列的表,并在其中插入两行值分别为1和2,然后运行以下查询“Select Avg(column)From table”我得到的是一个截断的结果,而不是1.5,这是我从地球上几乎任何其他数据库中得到的结果,它会自动升级数据类型以存储整个结果,而不是截断/舍入到列数据类型。现在我知道我可以在每种可能的情况下解决这个问题,但不是一个好的动态解决方案,特别是对于数据分析产品的数据分析。。。例如:Cognos/Microstrategy等

我从事数据仓库工作,拥有包含数百万行的事实数据表。。。我想存储小列,并有适当的聚合结果。我目前解决这一细微差别的方法是将最小的可量化列定义为数字(19,5),以说明所有情况,即使这些列多次只存储1或0,对于这两个列,tinyint可能很好,但不会自然聚合


是否没有任何指令告诉SQL server做其他数据库(oracle/db2/informix/access等)做的事情?这是推广到一个更大的类型,并显示整个结果,让我做什么,我想与他们

您可以在表上创建视图,将
smallint
tinyint
转换为
float
,并仅向用户发布这些视图。这将保持较小的内存使用量。与其他数据库系统相比,如果它们使用不同的数据类型进行聚合,那么转换应该不会产生任何开销。

您可以在表上创建视图,将
smallint
tinyint
转换为
float
,并仅将这些视图发布给用户。这将保持较小的内存使用量。与其他数据库系统相比,如果它们使用不同的数据类型进行聚合,那么转换应该不会产生任何开销。

虽然这可能会让您感到沮丧,但许多编程语言在INT中也会以这种方式运行,
1/2
将吐出
0
。见:

这是一个设计怪癖,如果他们改变它,它会破坏很多东西。您的问题是,您是否可以更改SQL Server的基本行为方式,从而可能破坏服务器上运行的任何其他代码

简单地说,不,你不能

你错了,其他所有DB产品都是这样,Derby也做同样的事情:

在Oracle文档中,它们特别警告您,无论原始类型如何,AVG都将返回浮点值。这是因为每种语言都必须做出选择,我是返回原始类型还是最精确的答案?为了阻止溢出,许多语言选择了前者,这让各地的程序员不断感到沮丧


因此,在SQL Server中,要得到一个浮点值,就要放入一个浮点值。

虽然这可能会让您感到沮丧,但许多编程语言在使用int时也是如此,
1/2
会吐出
0
。见:

这是一个设计怪癖,如果他们改变它,它会破坏很多东西。您的问题是,您是否可以更改SQL Server的基本行为方式,从而可能破坏服务器上运行的任何其他代码

简单地说,不,你不能

你错了,其他所有DB产品都是这样,Derby也做同样的事情:

在Oracle文档中,它们特别警告您,无论原始类型如何,AVG都将返回浮点值。这是因为每种语言都必须做出选择,我是返回原始类型还是最精确的答案?为了阻止溢出,许多语言选择了前者,这让各地的程序员不断感到沮丧


所以在SQL Server中,要获得一个浮点值,就要放入一个浮点值。

据我所知,最快的方法是执行隐式转换:
选择平均值(Field*1.0)
。当然,您也可以用同样的方法进行显式强制转换。据我所知,没有办法告诉SQL Server,当平均整数时,您希望将其转换为浮点数,可以说这实际上是正确的行为。

据我所知,最快的方法是进行隐式转换:
选择平均值(字段*1.0)
。当然,您也可以用同样的方法进行显式强制转换。据我所知,没有办法告诉SQL Server,当对整数进行平均时,您希望将其转换为浮点数,可以说这实际上是正确的行为。

您是否考虑过添加一个可在聚合中使用的计算列<代码>铸态列(列为数字(19,5))。它不会占用表中的任何空间,但必须在查询中进行转换,这需要一些额外的时间。抱歉,是的,DW事实表上的性能开销不是我们想要的跨越数百万行数据的开销,以及必须为每个定量值维护两列的开销。我想这已经到了紧要关头了。。。出于BI/EDW目的,不能利用SQL Server小数据类型值(Byte、TinyInt、SmallInt、Int)并期望summary/aggregate SQL函数在默认情况下生成准确的结果。我认为这是dB引擎中的一个主要设计疏忽,它肯定会使它们的大多数数字类型无法用于干净的临时分析目的。如果您有很多行,您可能还会遇到SQL Server内部使用
sum(col)/count(*)
计算
avg()
的问题。如果总和超过
int
的限制,内部
sum()
部分将失败。为了安全起见,您需要将
avg()
中的值强制转换为
bigint
。如果您改为强制转换为数值(38,0),您还将检索一个corr