如题,在存储过程中,如果把set ANSI_NULLS ON 改为OFF 并编译,可以生效。
但问题是重新打开存储过程,会发现set ANSI_NULLS 重新变为On
如果我进行了一些修改,然后忘记set ANSI_NULLS OFF再编译,由于这时set ANSI_NULLS自动变成了on
就会出现与本意不同的结果。
在网上都查不到如何设置。
谢谢!
但问题是重新打开存储过程,会发现set ANSI_NULLS 重新变为On
如果我进行了一些修改,然后忘记set ANSI_NULLS OFF再编译,由于这时set ANSI_NULLS自动变成了on
就会出现与本意不同的结果。
在网上都查不到如何设置。
谢谢!
你可以通过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 属性来确定此选项的状态。
ALTER DATABASE SET ANSI_NULL_DEFAULT OFF
但问题是重新打开存储过程,会发现set ANSI_NULLS 重新变为On ---------
刚刚试了下,SQL2005下不会变回来
2. 编译环境的ansi_nulls选项是取服务器的默认设置,一般不需要更改。这个设置与你的存储过程执行时的环境没有关系。不明白你的问题究竟在哪里。
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
~~~ 为啥我的总是变回了 OFF
------------
打错了,是变回了ON~~
如果是这样,这个默认设置是不能修改的,因为在2005的帮助文档说了:
后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。所以没有任何地方可以去修改设置,让你打开它的时候,这个属性可以让你去控制.