我有这个错误信息:
Msg 8134,级别16,状态1,第1行,除以零错误。
写SQL代码的最好方法是什么,这样我就再也不会看到这个错误消息了?
我可以做以下任何一件事:
添加where子句,使除数永远不为零
Or
我可以添加一个case语句,这样就可以对0进行特殊处理。
使用NULLIF子句是最好的方法吗?
有没有更好的办法,或者如何实施?
我有这个错误信息:
Msg 8134,级别16,状态1,第1行,除以零错误。
写SQL代码的最好方法是什么,这样我就再也不会看到这个错误消息了?
我可以做以下任何一件事:
添加where子句,使除数永远不为零
Or
我可以添加一个case语句,这样就可以对0进行特殊处理。
使用NULLIF子句是最好的方法吗?
有没有更好的办法,或者如何实施?
当前回答
你也可以在查询的开头这样做:
SET ARITHABORT OFF
SET ANSI_WARNINGS OFF
如果你有100/0,它会返回NULL。我只做了简单的查询,所以我不知道它会如何影响更长的/复杂的查询。
其他回答
编辑: 最近我得到了很多反对票…所以我想我只是添加了一个注释,这个答案是在问题经历了最近的编辑之前写的,返回null作为一个选项被高亮显示…这似乎是可以接受的。我的一些回答是针对Edwardo的担忧,在评论中,他似乎主张返回0。这就是我反对的案子。
答: 我认为这里有一个潜在的问题,即除以0是不合法的。这表明某些事情从根本上是错误的。如果你在除以0,你在尝试做一些数学上没有意义的事情,所以你得到的数字答案都是无效的。(在这种情况下使用null是合理的,因为它不是一个将在以后的数学计算中使用的值)。
所以Edwardo在评论中问道:“如果用户输入一个0呢?”他主张得到一个0应该是可以的。如果用户在金额中输入0,并且您希望在他们这样做时返回0,那么您应该在业务规则级别放入代码以捕获该值并返回0…没有一些特殊情况,除以0 = 0。
这是一个微妙的区别,但很重要……因为下次有人调用你的函数并希望它做正确的事情时,它做了一些奇怪的事情,从数学上来说是不正确的,但只是处理特定的边界情况,它有很好的机会在以后咬人。你不是真的除以0…你只是对一个糟糕的问题给出了一个糟糕的答案。
想象一下,我在写代码,结果搞砸了。我应该读取辐射测量缩放值,但在一个我没有预料到的奇怪边缘情况下,我读取的是0。然后我将我的值放入你的函数中…你给我一个0!万岁,没有辐射!除了它真的在那里,只是我传入了一个坏的值…但我不知道。我想让除法抛出错误因为它是出错的标志。
为了避免“除零”错误,我们编写了这样的程序:
Select Case when divisor=0 then null
Else dividend / divisor
End ,,,
但这里有一种更好的方式:
Select dividend / NULLIF(divisor, 0) ...
现在唯一的问题是记住NullIf位,如果我使用“/”键。
使用NULLIF(exp,0),但以这种方式- NULLIF(ISNULL(exp,0),0)
如果exp为空,NULLIF(exp,0)将中断,但NULLIF(ISNULL(exp,0),0)将不会中断
在这种情况下,你可以除以0。商业规则是计算库存周转,你用一段时间内的销售成本,按年计算。在你得到年化数字之后,你要除以该时期的平均库存。
I'm looking at calculating the number of inventory turns that occur in a three month period. I have calculated that I have Cost of Goods sold during the three month period of $1,000. The annual rate of sales is $4,000 ($1,000/3)*12. The beginning inventory is 0. The ending inventory is 0. My average inventory is now 0. I have sales of $4000 per year, and no inventory. This yields an infinite number of turns. This means that all my inventory is being converted and purchased by customers.
这是关于如何计算库存周转的业务规则。
There is no magic global setting 'turn division by 0 exceptions off'. The operation has to to throw, since the mathematical meaning of x/0 is different from the NULL meaning, so it cannot return NULL. I assume you are taking care of the obvious and your queries have conditions that should eliminate the records with the 0 divisor and never evaluate the division. The usual 'gotcha' is than most developers expect SQL to behave like procedural languages and offer logical operator short-circuit, but it does NOT. I recommend you read this article: http://www.sqlmag.com/Articles/ArticleID/9148/pg/2/2.html