为什么CONCAT_NULL_YIELDS_NULL是SQL Server中的默认设置?

时间:2015-09-18 14:12:30

标签: sql sql-server

来自MSDN文档:

  

当SET CONCAT_NULL_YIELDS_NULL为ON时,将空值与字符串连接会产生NULL结果。例如,SELECT'abc'+ NULL产生NULL。当SET CONCAT_NULL_YIELDS_NULL为OFF时,将空值与字符串连接将产生字符串本身(空值被视为空字符串)。例如,SELECT'abc'+ NULL产生abc。

这种行为的目的是什么?将它作为默认设置有什么用处?我知道可以通过更改设置或使用COALESCE等方法来规避它,但我不明白为什么这是标准设置。

2 个答案:

答案 0 :(得分:6)

null视为含义"未知"。如果将未知值与已知值连接,则结果仍然是未知值。

这是考虑ANSI合规性的null的标准方法。有关此问题的更多证据,请参阅https://en.wikipedia.org/wiki/Null_(SQL)

它声明:

  

SQL null是状态(未知)而不是值。这种用法与大多数编程语言完全不同,其中null表示未分配给特定实例。

答案 1 :(得分:2)

CONCAT_NULL_YIELDS_NULLdeprecated

  

在SQL Server CONCAT_NULL_YIELDS_NULL的未来版本中将始终如此   打开,任何明确将选项设置为OFF的应用程序将   生成错误。避免在新的开发工作中使用此功能,   并计划修改当前使用此功能的应用程序。

关于您的问题,这是per the SQL Standard

  

核心功能ID E021-07:使用||连接两个字符串   运营商:string1 || string2

     

如果至少有一个操作数为NULL,则结果为NULL

虽然SQL Server不使用标准||运算符。

在SQL空格中的大多数操作中,虽然存在一些不一致性,但仍会传播

NULL + 3返回NULL

SELECT SUM(N)
FROM   (VALUES (NULL),
               (3)) V(N) 

返回3以及忽略空值的信息性消息。

如果您至少使用SQL Server 2012,则可以使用CONCAT - 这会将NULL视为空字符串,就像您想要的那样。