SET ANSI_WARNINGS OFF 干了点儿啥?

在存储过程中经常会看到这个 SET ANSI_WARNINGS OFF .那么这个到底起了什么作用呢?

 

SET的选项中 ANSI_WARNINGS 是什么? 官方的解释 

简短总结就是:

ON 对一下几种数据库引擎行为进行ISO判断(该怎么办)

    1. 在聚合的时候遇到NULL
    2. 在0作为被除数
    3. 字符串截位

OFF 引擎遵循非标准行为,这会降低数据质量,并且根据业务上下文可能会生成错误数据。

 

下面演示这几种情况:

1.  在聚合的时候遇到NULL

 

SET ANSI_WARNINGS ON

 

USE tempdb 
GO
SET NOCOUNT ON; 
SET ANSI_WARNINGS ON; 
GO
 

DECLARE @i TABLE ( 
ID INT NOT NULL IDENTITY(1,1), 
DD DATETIME NULL 
)

INSERT INTO @i (DD) 
SELECT '2017-03-20' 
UNION ALL 
SELECT NULL 
UNION ALL 
SELECT '2017-03-19' 
UNION ALL 
SELECT '2017-03-02'

SELECT MAX(dd)  FROM @i;
/*执行结果 
2017-03-20 00:00:00.000*/


 

会生成警告信息

 

T1

 

 

SET ANSI_WARNINGS OFF

T2

这在平常使用中将会产生一些疑惑, 使用COUNT对含有NULL的列进行计数的时候,, 会将NULL消除,

SET ANSI_WARNINGS ON 时才会产生警告,OFF时将没有任何警告.

 

2.   在0作为被除数

SET ANSI_WARNINGS ON

USE tempdb 
GO
SET NOCOUNT ON; 
SET ANSI_WARNINGS ON; 
GO
 

DECLARE @T TABLE ( 
ID INT NOT NULL IDENTITY(1,1), 
colA DECIMAL(19,4) NULL, 
colB DECIMAL(19,4) NULL, 
[colA/colB] DECIMAL(19,4) NULL 
)

INSERT INTO @T (colA,colB) 
VALUES(1.0,2.1),(2.0,3.0),(3.0,0),(4.0,100.0);

UPDATE @T 
SET [colA/colB] =colA/colB

SELECT * FROM @T  


T3

随之还产生了一个8134的消息

T4

 

 

SET ANSI_WARNINGS OFF ,

不会返回结果,将直接产生一个错误.

T5

 

 

题外话,如果还想获取不是0为被除数结尾的计算结果该怎么办呢?

(还是有办法的)

SET ARITHABORT OFF

T6

T7

 

3. 字符串截位

USE tempdb 
GO
SET NOCOUNT ON; 
SET ANSI_WARNINGS ON; 
GO
DECLARE @T TABLE ( 
ID INT NOT NULL IDENTITY(1,1), 
colA VARCHAR(10) NULL, 
colB VARCHAR(10) NULL 
)

INSERT INTO @T (colA,colB) 
VALUES('Tree','oiosdoifooios');
 

SELECT * FROM @T 


T7

 

T8

 

SET ANSI_WARNINGS OFF ,

当输入字符串长于其被插入或更新的字段时,输入字符串的静默截断发生。

 

T9

 

T2

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值