如题,在存储过程中,如果把set ANSI_NULLS ON  改为OFF 并编译,可以生效。
但问题是重新打开存储过程,会发现set ANSI_NULLS 重新变为On
如果我进行了一些修改,然后忘记set ANSI_NULLS OFF再编译,由于这时set ANSI_NULLS自动变成了on 
就会出现与本意不同的结果。
在网上都查不到如何设置。
谢谢!

解决方案 »

  1.   

    如果数据库有设置,对象优先级高于数据库优先级,所以你不用担心.
    你可以通过ALTER DATABASE语句修改:
    在数据库级别控制 ANSI 编译选项。ANSI_NULL_DEFAULT { ON | OFF }
    确定在 CREATE TABLE 或 ALTER TABLE 语句中未显式定义为空性的 alias 数据类型或 CLR user-defined type 列的默认值(NULL 或 NOT NULL)。使用约束定义的列都将遵循约束规则,而与此设置无关。ON
    默认值为 NULL。OFF
    默认值为 NOT NULL。 连接级设置(使用 SET 语句设置)覆盖 ANSI_NULL_DEFAULT 的默认数据库级别设置。默认情况下,当连接到 SQL Server 的实例时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,将会话的 ANSI_NULL_DEFAULT 设置为 ON。有关详细信息,请参阅 SET ANSI_NULL_DFLT_ON (Transact-SQL)。 对于 ANSI 兼容性,数据库选项 ANSI_NULL_DEFAULT 设置为 ON 将使数据库默认设置改为 NULL。 可通过查看 sys.databases 目录视图中的 is_ansi_null_default_on 列或 DATABASEPROPERTYEX 函数的 IsAnsiNullDefault 属性来确定此选项的状态。 ANSI_NULLS { ON | OFF } 
    ON
    与空值的所有比较的结果均为 UNKNOWN。OFF
    如果两个值都为 NULL,则非 UNICODE 值与空值的比较结果为 TRUE。连接级设置(使用 SET 语句设置)覆盖 ANSI_NULLS 的默认数据库设置。默认情况下,当连接到 SQL Server 的实例时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,以将会话的 ANSI_NULLS 设置为 ON。有关详细信息,请参阅 SET ANSI_NULLS (Transact-SQL)。 建立或更改计算列或索引视图的索引时,SET ANSI_NULLS 也必须为 ON。 可通过查看 sys.databases 目录视图中的 is_ansi_nulls_on 列或 DATABASEPROPERTYEX 函数的 IsAnsiNullsEnabled 属性来确定此选项的状态。 
      

  2.   

    --try:
    ALTER DATABASE SET  ANSI_NULL_DEFAULT OFF 
      

  3.   

    如题,在存储过程中,如果把set ANSI_NULLS ON  改为OFF 并编译,可以生效。 
    但问题是重新打开存储过程,会发现set ANSI_NULLS 重新变为On ---------
    刚刚试了下,SQL2005下不会变回来
      

  4.   

    在创建或修改 Transact-SQL 存储过程时,数据库引擎 将保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。执行存储过程时,将使用这些原始设置。因此,所有客户端会话的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置在执行存储过程时都将被忽略。在创建或更改存储过程时不保存其他 SET 选项(例如 SET ARITHABORT、SET ANSI_WARNINGS 或 SET ANSI_PADDINGS)。如果存储过程的逻辑取决于特定的设置,则应在过程开头添加一条 SET 语句,以确保设置正确。从存储过程中执行 SET 语句时,该设置只在存储过程完成之前有效。之后,设置将还原为调用存储过程时的值。这样一来,单个客户端就可以设置所需的选项,而不会影响存储过程的逻辑。
      

  5.   

    在创建或修改 Transact-SQL 存储过程时,数据库引擎 将保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。执行存储过程时,将使用这些原始设置。因此,所有客户端会话的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置在执行存储过程时都将被忽略。在创建或更改存储过程时不保存其他 SET 选项(例如 SET ARITHABORT、SET ANSI_WARNINGS 或 SET ANSI_PADDINGS)。如果存储过程的逻辑取决于特定的设置,则应在过程开头添加一条 SET 语句,以确保设置正确。从存储过程中执行 SET 语句时,该设置只在存储过程完成之前有效。之后,设置将还原为调用存储过程时的值。这样一来,单个客户端就可以设置所需的选项,而不会影响存储过程的逻辑。
      

  6.   

    1. 如果你希望在存储过程执行的过程中依赖ansi_nulls选项,那么在你的存储过程内部设置。
    2. 编译环境的ansi_nulls选项是取服务器的默认设置,一般不需要更改。这个设置与你的存储过程执行时的环境没有关系。不明白你的问题究竟在哪里。
      

  7.   

    先谢谢大家的热心解答:我试验的存储过程如下:
    set ANSI_NULLS ON  --仍然是on
    set QUOTED_IDENTIFIER ON
    goALTER PROCEDURE [dbo].[test]
    ASdeclare @i int
    if @i=null
    print 'it's null'
    else
    print 'it's noNull'
    ----------------------------
    如果set ANSI_NULLS OFF 时应该能正常显示 'it's null'
    ---------------------------------------TO:dobear_0922  我在存储过程修改为OFF ,点执行.
    然后在查询分析器 exec test 结果是正常输出为it's null 的。这个是正确的,没问题。
    但问题是我重新打开存储过程 test ,发现上面又变成set ANSI_NULLS ON了。
    如果这是我不重新点“执行”编译,是没有任何问题的。
    但如果我不小心点了执行,这是就与要的结果不同了(因为此时set ANSI_NULLS ON)了
    我试过在存储过程直接加 set ANSI_NULLS OFF 也没有效果。我的意思是,每次我修改修改了存储过程,我必须记得在重新编译前把最上面的set ANSI_NULLS 修改为OFF,因为每次打开时都变成on 了 。而我想把该存储过程设为OFF,不用每次都修改。我用的是Sql server 2005 Developer版本。
    谢谢!TO:happyflystone 
    我试了 ALTER DATABASE Databasename  SET ANSI_NULLS off   
    但打开还是存储过程还是发现OFFtO:dobear_0922 
    ~~~ 为啥我的总是变回了 OFF
      

  8.   

    tO:dobear_0922 
    ~~~ 为啥我的总是变回了 OFF 
    ------------
    打错了,是变回了ON~~
      

  9.   

    原来你真是要求上面那段语句,而不是存储过程
    如果是这样,这个默认设置是不能修改的,因为在2005的帮助文档说了:

    后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。
    所以没有任何地方可以去修改设置,让你打开它的时候,这个属性可以让你去控制.