zoukankan      html  css  js  c++  java
  • 遇到了 “遇到以零作除数错误” 的问题

    开发的时候,写了个很简单的Sql ,大概就是 总数除以数量 得出的平均值。看起来很平常是不是!简单来说就是 Total / Count 嘛!最多转个2位小数用Convert就完事了对不对。

    但是呢,有些数据的Count值本身是就是0的。然后就会报遇到以0作为除数的错误的问题了啊~

    然后演示几种可能出现的情况,先初始化一个测试样例,

     1 CREATE TABLE TmpA1 (ID INT IDENTITY(1,1),Total NUMERIC(8,2),CountNr INT)
     2 
     3 INSERT INTO dbo.TmpA1
     4         ( Total, CountNr )
     5 VALUES  ( 1,1 ),
     6         ( 1,1 ),
     7         ( 0,0 ),
     8         ( 1,1 ),
     9         ( 1,1 )
    10 SELECT * FROM dbo.TmpA1
    11 
    12 ID          Total                                   CountNr
    13 ----------- --------------------------------------- -----------
    14 1           1.00                                    1
    15 2           1.00                                    1
    16 3           0.00                                    0
    17 4           1.00                                    1
    18 5           1.00                                    1
    创建测试表

    然后在一般默认的情况下如果使用这个语句,立马就会粗线以下的错误。因为ID = 3 的数据里面除数为0嘛对不对

    SELECT Total/CountNr FROM dbo.TmpA1
    
    消息 8134,级别 16,状态 1,第 10 行
    遇到以零作除数错误。

    但是如果是在查询的时候没有遇到这样的数据,那当然就不会报错罗 ~,比方说

    SELECT Total/CountNr FROM dbo.TmpA1 WHERE ID <> 3

    就正常了~

    当然我们是不太可能在查询的时候总是能跳过那些除数为0的数据的。有些也是要查出来。这样的话。修改的方法还是多种,最常见的是这种直接处理

    SELECT Total/CASE CountNr WHEN 0 THEN 1 ELSE CountNr END FROM dbo.TmpA1
    SELECT CASE CountNr WHEN 0 THEN 0 ELSE Total/CountNr END FROM dbo.TmpA1

    当然还是有另外的处理方法,就是屏蔽了“遇到以零作除数错误” 的错误信息(好拗口),这样的话,遇到0是除数的情况,就是赋值为Null

    SET ANSI_WARNINGS OFF;
    SET ARITHIGNORE ON;
    SET ARITHABORT OFF;
    GO
    
    SELECT 1 / 0
    SELECT Total/CountNr FROM dbo.TmpA1
    
    -----------
    NULL
    
    (1 行受影响)
    
    
    ---------------------------------------
    1.0000000000000
    1.0000000000000
    NULL
    1.0000000000000
    1.0000000000000

    可以说~这样不是更加方便吗?连Case when 都不用写了!!最多处理一下Isnull,0 就好了嘛~但是!!!有几种情况是不可以的

    1 当我们有使用链接服务器的时候!比方说这样纸,我随便调用了我的另外一台服务器,因为 ANSI_WARNINGS 的选项保持一致的,so 就报错啦!

    SET ANSI_WARNINGS OFF;
    SET ARITHIGNORE ON;
    SET ARITHABORT OFF;
    GO
    SELECT *
        FROM [GINPCGIN_Test].TestDB.dbo.TestTR1
    
    消息 7405,级别 16,状态 1,第 33 行
    异类查询要求为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项。这将确保查询语义一致。请启用这些选项,然后重新发出查询。

    2 当使用xml的时候也会跪,比方说

    SET ANSI_WARNINGS OFF;
    SET ARITHIGNORE ON;
    SET ARITHABORT OFF;
    GO
    
    DECLARE @Xml XML='
    <R><I>3</I></R>
    '
    
    SELECT Total/CountNr 
        FROM dbo.TmpA1 a
            WHERE @Xml.exist('R/I[text()=sql:column("a.ID")]') = 1

    当涉及到xml作为参数的时候,就会提示到这个ANSI_WARNING 这个设置不正确。这个原理我就不是太懂,还希望各位指教。

    但是解决方法也是比较简单的。就是把查询脱离xml解析的作用域就可以了。这个倒是好解决

    嗯~这次也说道这里~请各位清拍

  • 相关阅读:
    JavaScript-12(事件)
    JavaScript-11(DOM对象)
    JavaScript-10(去重数组)
    js中三元运算符的用法拓展
    JavaScript-5(常见题目-4)
    JavaScript-6(数组的大小排序)
    【CSP-S2019】10.28比赛总结
    【CSP-S2019模拟】10.27比赛总结
    JZOJ6392. 【NOIP2019模拟2019.10.26】僵尸
    【Comet OJ
  • 原文地址:https://www.cnblogs.com/Gin-23333/p/5322959.html
Copyright © 2011-2022 走看看