将作为varchar存储的数字10与浮点数1.1进行比较,会因算术溢出错误而失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将作为varchar存储的数字10与浮点数1.1进行比较,会因算术溢出错误而失败相关的知识,希望对你有一定的参考价值。

我正在使用SQL Server 2008 R2并且有一个已知的问题,用户将非数值放入varchar列(是的,我知道我可以将其更改为浮点数,但在此用例中有时非数字是正确的)。为了处理这个问题,我有一个每晚运行的SQL Server代理作业并检查列中的值是否可以强制转换为浮点数,如果没有,则在另一个名为INRLevelYN的列中设置一个标志,告诉其他查询/视图忽略那一行。

即使将varchar列中的值10转换为float工作(并且未设置inrlevelyn标志),当对列inrlevel > 1.1进行比较时会抛出错误(将varchar转换为数据类型numeric的算术溢出错误)。

select * 
from VM_AntiCoag_Rosendaal_v2 
where dateofdoseinr between '1/26/2017' and '1/26/2017' 
  and inrlevel > 1.1

如果inrlevel列中的值为10或更大,则似乎会发生这种情况。如果我将值更改为9.9或9,查询将返回没有错误。

inrlevel作为浮点数包装在一个角色中也解决了这个问题(见下文)

select * 
from VM_AntiCoag_Rosendaal_v2 
where dateofdoseinr between '1/26/2017' and '1/26/2017' 
  and cast(inrlevel as float) > 1.1

我知道演员作为浮动解决方案有效,但我想知道这是否是一个已知问题或者是否有任何其他建议。由于我可以将它转换为浮动,为什么SQL Server一旦达到10 vs 9.9或9的值就不能正确处理它。

我已经回顾了关于stackoverflow的建议问题,并且不觉得他们回答了这个特定的问题,尽管一个是三位数范围内的数字与两位数范围的关系。

答案

发生这种情况是因为你隐式地将inrlevel作为numeric (2,1)进行投射,因为这就是1.1的比例和精度。它和写作一样:

select cast(10 as numeric(1,1))

因为你必须明确地转换它以避免它,我会把它投射到你的数字,而不是列,所以只需要调用一次函数。

select 1 where '10' > cast(1.0 as numeric(4,2))

或者在您的情况下......只需使用适当的精度和比例

select * 
from VM_AntiCoag_Rosendaal_v2 
where dateofdoseinr between '1/26/2017' and '1/26/2017' 
      and inrlevel  > cast(1.1 as numeric(4,2))

以上是关于将作为varchar存储的数字10与浮点数1.1进行比较,会因算术溢出错误而失败的主要内容,如果未能解决你的问题,请参考以下文章

1定点数与浮点数

处理大数字与浮点数

整型数与浮点数在内存中的表示

与浮点数和双精度相关的概念

当 Sklearn 朴素贝叶斯与浮点数一起使用时出现未知标签类型错误

Python将包含科学值和浮点值的熊猫数据框与浮点数相乘