zoukankan      html  css  js  c++  java
  • 关于SQL Server的SET ANSI_NULLS的问题

    查了查SQL Server文档,发现Null值的比较运算,存在两种规则:
    在SQL2000中Null值的比较运算有两种规则。一种是ANSI SQL(SQL-92)规定的Null值的比较取值结果都为False,既Null=Null取值也是False。另一种不准循ANSI SQL标准,即Null=Null为True。
    以一张表T的查询为例。

    表T存在下面的数据:
    RowId Data
    --------------
    1 'test'
    2 Null
    3 'test1'

    按照ANSI SQL标准,下面的两个查询都不返回任何行:
    Query1: select * from T where Data=null
    Query2: select * from T where Data<>null
    而按照非ANSI SQL标准,查询1将返回第二行,查询2返回1、3行。
    ANSI SQL标准中取得Null值的行需要用下面的查询:
    select * from T where Data is null
    反之则用is not null。由此可见非ANSI SQL标准中Data=Null等同于Data Is Null,Data<>Null等同于Data Is Not Null。

    而 控制采用那一种规则,需要使用命令SET ANSI_NULLS [ON/OFF]。ON值采用ANSI SQL标准,OFF值采用非标准模式。另外SET ANSI_DEFAULTS [ON/OFF]命令也可以实现标准的切换,只是这个命令控制的是一组符合SQL-92标准的设置,其中就包括Null值的标准。

    默认情 况下,数据库管理程序(DB-Library)是SET ANSI_NULLS为OFF的。但是我们的大多数应用程序,都是通过ODBC或者OLEDB来访问数据库的,作为一种开放兼容的数据库访问程序,或许是 兼容性的考虑,SET ANSI_NULLS值设置为ON。这样一来带来的一些问题是需要注意的。像存储过程或者自定义函数这样的应用程序都是基于DB-Library的,默认 情况下,SET ANSI_NULLS为OFF,并且在这样的程序中,不能使用SET ANSI_NULLS在一个环境中修改规则,只能修改数据库配置参数。

  • 相关阅读:
    程序员修炼之道:从小工到专家--读书摘录
    代码规范--捡拾(SQL语句)
    新博客,新生活
    如何用Eclipse+maven创建servlet 3.0 web 项目
    swift -- 枚举
    swift -- 函数
    控制语句 for while if switch
    swift -- 字符串
    swift -- 集合
    swift -- 字典
  • 原文地址:https://www.cnblogs.com/xiaonanmu/p/3054657.html
Copyright © 2011-2022 走看看