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

  • 相关阅读:
    Ubuntu系统
    demo日常报错
    python 实现两个多维数组去重处理
    奔跑检测
    安装Win11如何绕过TPM2.0的安全限制?
    Nginx的Rewrite
    gvim 配置
    Tokyo Cabinet和Tokyo Tyrant及PHP扩展包的安装
    fm rf 删除 恢复
    提高页面loadtime的几个方法
  • 原文地址:https://www.cnblogs.com/xiaonanmu/p/3054657.html
Copyright © 2011-2022 走看看