• 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*/



    会生成警告信息

    T1

    SET ANSI_WARNINGS OFF

    T2

    这在平常使用中将会产生一些疑惑, 使用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



    T3

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

    T4

    SET ANSI_WARNINGS OFF ,

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

    T5

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

    (还是有办法的)

    SET ARITHABORT OFF

    T6

    T7

    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



    T7

    T8

    SET ANSI_WARNINGS OFF ,

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

    T9

    T2

  • 相关阅读:
    java进程自动杀死
    线程池的取值(一)与拒绝策略
    zju 1383 Binary Numbers
    可以连续几行数,,,分别相加求和
    几个数字的和
    zju 2812 Quicksum---------hdu 2734
    rwkj 1332 C语言实验四(函数):题目1、数字根
    zju 1295 Reverse Text
    zju 1241 Geometry Made Simple
    hdu 1379 DNA Sorting
  • 原文地址:https://www.cnblogs.com/tdskee/p/13993810.html
Copyright © 2020-2023  润新知