ALTER DATABASE XMMDS SET CONCAT_NULL_YIELDS_NULL OFF
select databasepropertyex('XMMDS','ISNULLCONCAT')
/*0*/
SELECT 'ACVS'+NULL
/*
NULL*/
--请问这是为什么
select databasepropertyex('XMMDS','ISNULLCONCAT')
/*0*/
SELECT 'ACVS'+NULL
/*
NULL*/
--请问这是为什么
SELECT 'ACVS'+isnull(NULL,'')
这个设置允许连接空值忽略空值
我的select 'safds'+null 理论值应该得到 safds
''才是空值
任何字符串连接一个未知值,结果都是未知的
你感觉我说的空值是''么?只是中文翻译过来的NULL都是叫空值。不过还是谢谢指点
实际上我也经常叫null值为空值,翻译什么的容易让人混淆
SQL 中的NULL 值,表示不知道(UNKNOWN)的数据,用作不知道数据的具体值,或者不
知道数据是否存在,或者数据不存在等情况。因为引入了NULL 值,故此SQL 的逻辑系统是
三值逻辑系统——FALSE、TRUE、NULL 三种值构成的逻辑系统。
1、OR、AND、NOT 真值表
A B A OR B A AND B NOT A
FALSE FALSE FALSE FALSE TRUE
FALSE TRUE TRUE FALSE ‐
FALSE NULL NULL FALSE ‐
TRUE FALSE TRUE FALSE FALSE
TRUE TRUE TRUE TRUE ‐
TRUE NULL TRUE NULL ‐
NULL FALSE NULL FALSE NULL
NULL TRUE TRUE NULL ‐
NULL NULL NULL NULL ‐
因为NULL 当UNKNOWN 来理解,因此,当值为NULL 时,它既有可能是FALSE 也有可能是
TRUE。如果计算结果只有一种可能,则取该种可能;如果计算结果既有可能是FALSE,也有
可能是TRUE,那么结果便为NULL。例如,NOT NULL,其结果也有两种可能,因此NOT NULL
的结果是NULL。再例如,NULL AND TRUE,则其结果也有两种可能,因此NULL AND TRUE
的结果是NULL。但是,NULL OR TRUE,或是NULL AND FALSE,前者结果为TRUE,单是一个
TRUE 出现,便足以知道结果为TRUE;后者结果为FALSE,单是一个FALSE 出现,便足以知
道结果为FALSE。这是OR 和AND 的特性决定的。
2、比较运算符及算术运算符中的NULL
比较运算符及算术运算符中的NULL,会导致运算结果也为NULL。如3+NULL 的结果为NULL,
NULL>=5 的结果为NULL,等等。
3、BETWEEN AND、IN 中的NULL
A BETWEEN B AND C 意为A>=B AND A<=C,因此其产生NULL 值的情况,可以参照后者判
断。A NOT BETWEEN B AND C 相应等价于NOT(A>=B AND A<=C)。
A IN(B,C,D)意为A=B OR A=C OR A=D,因此其产生NULL 值的情况,可以参照后者判断。A NOT
IN(B,C,D)相应等价于NOT(A=B OR A=C OR A=D)。当集合为空时,IN 的结果为FALSE,NOT IN
的结果则为TRUE。
4、EXISTS、IS NULL
EXISTS(以及NOT EXISTS)、IS NULL(以及IS NOT NULL),均只产生FALSE 或TRUE,而不
产生NULL。
5、ANY、ALL
在一个值与一个集合(一组值)比较时,比较运算符可以加上ANY(或SOME,作用相同)
或ALL。
A>ANY(B,C,D)意为A>B OR A>C OR A>D,因此其产生NULL 值的情况,可以参照后者判断。
当集合为空时,ANY 的结果为FALSE。
A>ALL(B,C,D)意为A>B AND A>C AND A>D,因此其产生NULL 值的情况,可以参照后者判断。
当集合为空时,ALL 的结果为TRUE。
6、WHERE、HAVING、ON 条件筛选,与完整性约束检查
在WHERE、HAVING、ON 条件筛选中,只保留结果为TRUE 的,而不处理FALSE 及NULL
的。但在完整性约束检查中,只有结果为FALSE 的,才违反约束检查,NULL 并不违反。
SELECT 'ACVS'+ isnull(NULL,'')
-- 数据库级设置,首先确认语句是否在 XMMDS 库中执行:
USE XMMDS
GOSELECT 'ACVS'+NULL
-- 会话级的设置SET CONCAT_NULL_YIELDS_NULL ON
SELECT 'ACVS'+NULLSET CONCAT_NULL_YIELDS_NULL OFF
SELECT 'ACVS'+NULL
空值基本上认为是NULL,''一般叫空串,不叫空值。
ALTER DATABASE AdventureWorks SET CONCAT_NULL_YIELDS_NULL OFF
select databasepropertyex('AdventureWorks','ISNULLCONCAT')
SET CONCAT_NULL_YIELDS_NULL OFF
SELECT 'ACVS'+NULL
/*
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0
(1 行受影响)
-----
ACVS
(1 行受影响)
*/
alter database ,sp_dboption 都设置过,也不行。这个设置明明是,DC级别,为什么非要设置会话级别
SQL 2000 的sp_dboption有 concat null yields null 这项设置
set 选项总是会覆盖相应的数据库选项,不论SET选项是on还是off.
数据库起作用唯一情况是SET选项没有被碰过时
因此可以吧ANSI_NULL及CONCAT_NULL_YIELDS_NULL 选项想象成三种值:ON,OFF,从未被设置
如果SET选项是OF或者OFF数据库选项就会被忽略
建议用户写查询与选项无关的查询
如果非要写选项
用户应该依赖会话级别的选项而不是数据库级别的选项
GO
create proc P_TEST
as
SELECT 'ACVS'+NULL
GO
exec P_TEST
/*-----
ACVS(1 行受影响)*/
许多工具
例如ODBC,包括SQL Server Management等连接SQL Server工具
都会启用会话级别的选项
这些选项会覆盖数据库选项,是的看起来ON行为好像是默认行为一样
用
DBCC USEROPTIONS可以看到当前连接被显式设置的值quoted_identifier SET
arithabort SET
ansi_null_dflt_on SET
ansi_warnings SET
ansi_padding SET
ansi_nulls SET
concat_null_yields_null SET