将作为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进行比较,会因算术溢出错误而失败的主要内容,如果未能解决你的问题,请参考以下文章