Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server 2008中计算对数时出现无效的浮点操作错误_Sql_Sql Server 2008 - Fatal编程技术网

在SQL Server 2008中计算对数时出现无效的浮点操作错误

在SQL Server 2008中计算对数时出现无效的浮点操作错误,sql,sql-server-2008,Sql,Sql Server 2008,在MicrosoftSQLServer2008中,我有一个表,比如说myTable,包含大约60万行(实际上,这是连接其他几个表的结果,但我认为这并不重要)。它的一个列,比如value是numeric(6,2)类型 简单的查询SELECT value FROM myTable ORDER BY value当然会返回大约600k个数字,从1.01开始(即最低),以70.00结束(最高);无NULLs或其他值 请注意,所有这些值都是数值和正值。但是,当从myTable调用选择日志(值)时,我得到一条

在MicrosoftSQLServer2008中,我有一个表,比如说
myTable
,包含大约60万行(实际上,这是连接其他几个表的结果,但我认为这并不重要)。它的一个列,比如
value
是numeric(6,2)类型

简单的查询
SELECT value FROM myTable ORDER BY value
当然会返回大约600k个数字,从1.01开始(即最低),以70.00结束(最高);无
NULL
s或其他值

请注意,所有这些值都是数值和正值。但是,当从myTable调用
选择日志(值)时,我得到一条错误消息“发生了无效的浮点操作”

此错误总是在查询运行约3分钟后出现。将600k值复制到Excel并计算其LN()时,绝对没有问题

我曾尝试将
转换为实值或浮点值,但毫无帮助。最后,我找到了一个解决方法:
从myTable中选择LOG(值>0时为CASE,值为1时为END)。这很有效。但为什么,当所有的价值观都是积极的?我尝试将结果与Excel计算的对数进行比较——它们都是相同的(只有某些行出现10^(-15)或更小的顺序差异,这几乎可以肯定是由不同的精度给出的)。这意味着
CASE
语句中的条件总是真的,我想


有人知道为什么会发生这种错误吗?谢谢你的帮助。谢谢。

您可以确定导致问题的具体值

declare @f numeric(6,2), @r float
begin try select
    @f = value, @r = LOG(value) 
from mytable
end try begin catch
    select error_message(),'value=',@f
end catch

在执行日志记录(0)时,会出现此错误-“发生了无效的浮点操作”。对数(零)的值在数学界是不确定的,因此存在误差


干杯。

+1。好主意,但从海伦娜发布的消息来看,我担心这可能不会产生任何效果!谢谢你的主意,亚历克斯。它还告诉我,
NULL
值可能存在问题,这是由于
左连接产生的,并且在
具有
条件时被消除(是的,查询相当复杂)。虽然
SELECT LOG(NULL)
本身返回
NULL
,但这不是一个错误,因此我不确定为什么在更复杂的查询中会出现问题……如果日志失败,是否会分配@f?或者是另一行没有呢?我相信是的,对于一个包含一个负值的表,你会得到正确的@f(你也可以使用LOG(@f))@gbn:嗯,我想@f应该被分配最新的值,不管它的LOG()是否失败。计数日志(@f)不应该改变@f,我想。@Helena:可能是个bug。在Connect上复制并提交会很好。@Helena-它可能会对一个无效值进行
Log
计算,该值后来被where子句或join条件消除@Mitch已经有一个了你的原始查询是如何组织的?LOG()函数可能应用于某些中间结果集,这些结果集可能包含不太好的“大于1”的数值。有关类似问题的解释,请参见此答案。我认为Martin和Arvo是正确的-包含
列的表肯定包含负值。只有连接和条件消除它们的地方。。。我只是对查询的执行方式有一个错误的想法。我几乎可以肯定你拿到了。谢谢大家!