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

  1.  
    USE tempdb
  2.  
    GO
  3.  
    SET NOCOUNT ON;
  4.  
    SET ANSI_WARNINGS ON;
  5.  
    GO
  6.  
     
  7.  
     
  8.  
    DECLARE @i TABLE (
  9.  
    ID INT NOT NULL IDENTITY(1,1),
  10.  
    DD DATETIME NULL
  11.  
    )
  12.  
     
  13.  
    INSERT INTO @i (DD)
  14.  
    SELECT '2017-03-20'
  15.  
    UNION ALL
  16.  
    SELECT NULL
  17.  
    UNION ALL
  18.  
    SELECT '2017-03-19'
  19.  
    UNION ALL
  20.  
    SELECT '2017-03-02'
  21.  
     
  22.  
    SELECT MAX(dd) FROM @i;
  23.  
    /*执行结果
  24.  
    2017-03-20 00:00:00.000*/



会生成警告信息

SET ANSI_WARNINGS OFF 干了点儿啥?

SET ANSI_WARNINGS OFF

SET ANSI_WARNINGS OFF 干了点儿啥?

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

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

2.   在0作为被除数

SET ANSI_WARNINGS ON

  1.  
    USE tempdb
  2.  
    GO
  3.  
    SET NOCOUNT ON;
  4.  
    SET ANSI_WARNINGS ON;
  5.  
    GO
  6.  
     
  7.  
     
  8.  
    DECLARE @T TABLE (
  9.  
    ID INT NOT NULL IDENTITY(1,1),
  10.  
    colA DECIMAL(19,4) NULL,
  11.  
    colB DECIMAL(19,4) NULL,
  12.  
    [colA/colB] DECIMAL(19,4) NULL
  13.  
    )
  14.  
     
  15.  
    INSERT INTO @T (colA,colB)
  16.  
    VALUES(1.0,2.1),(2.0,3.0),(3.0,0),(4.0,100.0);
  17.  
     
  18.  
    UPDATE @T
  19.  
    SET [colA/colB] =colA/colB
  20.  
     
  21.  
    SELECT * FROM @T



SET ANSI_WARNINGS OFF 干了点儿啥?

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

SET ANSI_WARNINGS OFF 干了点儿啥?

SET ANSI_WARNINGS OFF ,

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

SET ANSI_WARNINGS OFF 干了点儿啥?

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

(还是有办法的)

SET ARITHABORT OFF

SET ANSI_WARNINGS OFF 干了点儿啥?

SET ANSI_WARNINGS OFF 干了点儿啥?

3. 字符串截位

  1.  
    USE tempdb
  2.  
    GO
  3.  
    SET NOCOUNT ON;
  4.  
    SET ANSI_WARNINGS ON;
  5.  
    GO
  6.  
    DECLARE @T TABLE (
  7.  
    ID INT NOT NULL IDENTITY(1,1),
  8.  
    colA VARCHAR(10) NULL,
  9.  
    colB VARCHAR(10) NULL
  10.  
    )
  11.  
     
  12.  
    INSERT INTO @T (colA,colB)
  13.  
    VALUES('Tree','oiosdoifooios');
  14.  
     
  15.  
     
  16.  
    SELECT * FROM @T



SET ANSI_WARNINGS OFF 干了点儿啥?

SET ANSI_WARNINGS OFF 干了点儿啥?

SET ANSI_WARNINGS OFF ,

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

SET ANSI_WARNINGS OFF 干了点儿啥?

SET ANSI_WARNINGS OFF 干了点儿啥?