• 关于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在一个环境中修改规则,只能修改数据库配置参数。

  • 相关阅读:
    Android 系统广播机制
    NBUT 1457 Sona (莫队算法)
    内存分配--静态内存、栈和堆
    Hibernate主键生成策略
    UVA 1482
    servlet开篇
    C语言的代码内存布局具体解释
    Mirantis Fuel fundations
    openstack中文文档
    C++ 之再继续
  • 原文地址:https://www.cnblogs.com/xiaonanmu/p/3054657.html
Copyright © 2020-2023  润新知