TSQL-CONCAT_NULL_在不返回NULL时生成_NULL?

TSQL-CONCAT_NULL_在不返回NULL时生成_NULL?,tsql,sql-server-2008-r2,string-concatenation,Tsql,Sql Server 2008 R2,String Concatenation,我环顾四周,似乎发现SQLServer2008R2存在一个奇怪的问题 我理解,使用CONCAT_NULL_产生_NULL=ON意味着以下内容将始终解析为NULL SELECT NULL + 'My String' 我对此很满意,但是当将它与COALESCE()结合使用时,它似乎无法在我的数据库中工作 考虑以下查询,其中MyString是VARCHAR(2000) 现在在我的查询中,当MyString为NULL时,它返回一个空(非NULL)字符串。我可以在查询结果窗口中看到这一点 然而,非常罕见

我环顾四周,似乎发现SQLServer2008R2存在一个奇怪的问题

我理解,使用CONCAT_NULL_产生_NULL=ON意味着以下内容将始终解析为NULL

SELECT NULL + 'My String'
我对此很满意,但是当将它与COALESCE()结合使用时,它似乎无法在我的数据库中工作

考虑以下查询,其中MyString是VARCHAR(2000)

现在在我的查询中,当MyString为NULL时,它返回一个空(非NULL)字符串。我可以在查询结果窗口中看到这一点

然而,非常罕见的是,当与INSERT一起运行时,它无法识别CONCAT_NULL,而是生成了_NULL,插入一个空白的“,”

insert的查询如下所示

CONCAT_NULL_YIELDS_NULL ON
INSERT INTO Mytable(StringValue)
SELECT COALESCE(MyString + ', ', '')
FROM MyTableOfValues

除此之外,我还检查了数据库,CONCAT_NULL_产生了_NULL=TRUE…

Coalesce返回其参数中的第一个非NULL表达式

您将得到一个“,”,因为它是合并调用中的第一个非空表达式


从提供的一些答案中,我能够更深入地理解COALESCE()

上述查询无法完全工作的原因是,尽管我检查了null,但空字符串(“”)不被视为null。因此,尽管上述查询有效,但我应该先检查表中的空字符串

e、 g

会回来的

FullName
-----------
Joe, Bloggs
Jones
, Jones
Bob, Tielly
现在,第3行返回了一个“,”字符,这是我最初不希望看到的,因为它是一个空白但不是空值

下面的代码现在可以正常工作,因为它检查空白值。这是可行的,但看起来我走了很长的路。也许有更好的办法

-- Ammended Query
SELECT COALESCE(REPLACE(FirstName, Firstname , Firstname + ', '), '') + Surname AS FullName0
FROM 
(
    SELECT 'Joe' AS Firstname, 'Bloggs' AS Surname UNION ALL
    SELECT NULL, 'Jones'  UNION ALL
    SELECT '', 'Jones'  UNION ALL
    SELECT 'Bob', 'Tielly'
) AS [MyTable]
使用
NULLIF(MyString',)
而不仅仅是
MyString

SELECT COALESCE(NULLIF(MyString, '') + ', ', '') FROM MyTableOfValues
从MyTableOfValues中选择合并(NULLIF(MyString),)+,,,“”)

似乎参数列表中的逗号太多,无法合并。请尝试使用COALESCE(MyString+',','')而不是COALESCE(MyString,+','','')。抱歉,Jakob,我在上面的示例中输入错误。这个问题的查询被重新格式化,因为我不打算发布所有的专栏细节。你可以考虑(MySc++',',' ''是我使用的。很抱歉我将编辑帖子。因为,我在字符串上使用contact,因为我想在末尾使用逗号和空格。使用CONCAT_NULL_生成_NULL,shouldnt MyString+,“返回NULL值,因此输出”。我当然在输出窗口(SSMS中的结果到网格)中看到了这一点,但它在插入时不起作用。-编辑,Caps。无法复制(通过在
CONCAT…
前面添加
SET
更正了您的示例查询)-如果我们使用您运行的实际查询来显示问题,会容易得多。我意识到尽管
COALESCE()
正在检查空值。表中有空字符串,但由于格式原因,我没有看到这些字符串。因此,(我觉得有点愚蠢)它正在按预期工作。我需要从“MyTableOfValues”中选择任何空字符串。
-- Ammended Query
SELECT COALESCE(REPLACE(FirstName, Firstname , Firstname + ', '), '') + Surname AS FullName0
FROM 
(
    SELECT 'Joe' AS Firstname, 'Bloggs' AS Surname UNION ALL
    SELECT NULL, 'Jones'  UNION ALL
    SELECT '', 'Jones'  UNION ALL
    SELECT 'Bob', 'Tielly'
) AS [MyTable]
SELECT COALESCE(NULLIF(MyString, '') + ', ', '') FROM MyTableOfValues