遇到了 “遇到以零作除数错误” 的问题

开发的时候,写了个很简单的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 [GINPC\GIN_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解析的作用域就可以了。这个倒是好解决

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

时间: 2024-10-14 06:52:33

遇到了 “遇到以零作除数错误” 的问题的相关文章

sqlserver 遇到以零作除数错误的处理 不报错的解决方法

原文:sqlserver 遇到以零作除数错误的处理 不报错的解决方法 使用sqlserver 的选项来禁止出现以零除的错误中断,让而让其为null set ansi_warnings offSET ARITHABORT offSET ARITHIGNORE on select 1/0 显示结果 无列名 null

MSSQL遇到以零作除数错误的处理方法

在sql server中做除法处理的时候,我们经常需要处理除数为零的情况,因为如果遇到这种情况的时候,sqlserver会抛出遇到以零作除数错误的异常,我们总不希望把这个异常显示给用户吧. 做个会报这个错误的示例,如以下sql代码: declare @a int;declare @b int;set @a=10set @b=0select @a/@b 运行就会抛出遇到以零作除数错误的错误 本章主要讲解一下如何在sql server处理除数为零的两种方法:一,利用case语句.我们改写上面的sql

遇到sql server 遇到以零作除数错误

两种方法: 原: SELECT (Quantity*Price)/(Quantity*UnitPrice) AS [平均值]  FROM ##表  报错:遇到以零作除数错误 1.在除数那里判断分母是否为0(用'NULLIF'函数) SELECT (Quantity*Price)/NULLIF((Quantity*UnitPrice),0) AS [平均值]   FROM ##表 2.在除数那里判断分母是否为0(用'CASE WHEN'函数) SELECT (CASE WHEN Quantity*

sql server中除数为零的处理技巧

在sql server中做除法处理的时候,我们经常需要处理除数为零的情况,因为如果遇到这种情况的时候,sqlserver会抛出遇到以零作除数错误的异常,我们总不希望把这个异常显示给用户吧. 做个会报这个错误的示例,如以下sql代码: declare @a int;declare @b int;set @a=10set @b=0select @a/@b 运行就会抛出遇到以零作除数错误的错误 本章主要讲解一下如何在sql server处理除数为零的两种方法:一,利用case语句.我们改写上面的sql

SQL函数说明大全

一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下表给出了T-SQL函数的类别和描述. 函数类别 作用 聚合函数 执行的操作是将多个值合并为一个值.例如 COUNT.SUM.MIN 和 MAX. 配置函数 是一种标量函数,可返回有关配置设置的信息. 转换函数 将值从一种数据类型转换为另一种. 加密函数 支持加密.解密.数字签名和数字签名验证. 游标函数 返回有关游标状态的信息.

SQL Server2012中的Throw语句尝试 RAISERROR和THROW比较

SQL SERVER2012实现了类似C#抛出异常的Throw语句.相比较于SQL Server2005之前使用@@ERROR,和SQL Server2005之后使用RAISERROR()引发异常都是一个不小的进步. 1.SQL Server2005/2008中,使用RAISERROR和TRY…CATCH语句来抛出异常相比较根据@@ERROR进行判断来讲已经进步了很多.但是使用RAISERROR有一个非常不好的一点是无法返回真正出错的行数. --使用RAISERROR返回错误行数不正确begin

T-SQL 批处理

批处理简介 批处理是作为一个逻辑单元的T-SQL语句.如果一条语句不能通过语法分析,那么不会运行任何语句.如果一条语句在运行时失败,那么产生错误的语句之前的语句都已经运行了. 为了将一个脚本分为多个批处理,可使用GO语句. GO语句的特点: GO语句必须自成一行,只有注释可以再同一行上. 它使得自脚本的开始部分或者最近一个GO语句以后的所有语句编译成一个执行计划并发送到服务器,与任何其他批处理无关. GO语句不是T-SQL命令,而是由各种SQL Server命令实用程序(如:Management

YourSQLDba备份失败案例锦集

使用YourSQLDba做备份.维护.管理时,偶尔会收到一些备份失败的邮件.导致YourSQLDba备份失败的情况比价多,打算在此篇中对YourSQLDba备份失败的案例做一些总结.整理. 1:YourSQLDba由于事务日志满了.具体情况如下: 检查YourSQLDba备份失败日志信息,你会看到下面这类错误信息. The transaction log for database 'xxxx' is full.To find out why space in the log cannot be

(转)SQL Server2005 异常处理机制(Begin try Begin Catch)

begin try --SQL  end trybegin catch --sql (处理出错动作) end catch我们将可能会出错的sql 写在begin try...end try 之间,若出错,刚程序就跳到紧接着的begin try...end try 的beign catch...end catch中,执行beign catch...end catch错误处理SQL.try..catch 是可以嵌套的.在begin catch ...end catch中我们可以利用系统提供的下面四个