2010-08-03 100 views
2

我可能试图在处理所有困难的事情后做一件简单的事情,但似乎这让我很头疼。我想连接文本到变量@strXml这是一个nvarchar变量来构建Xml元素,但@strXml返回null。请帮忙。我在下面发布我的代码。nvarchar串联问题

DECLARE @strXml nvarchar(max) = '' 
SET @strXml = '<PromoName>' + (Select PromoName From #Temp) + '</PromoName>' 
SET @strXml = @strXml + '<PromoDesc>' + (Select PromoDesc From #Temp) + '</PromoDesc>' 
SET @strXml = @strXml + '<PromoCode>' + (Select PromoCode From #Temp) + '</PromoCode>' 
SET @strXml = @strXml + '<BeginDate>' + (Select Convert(nvarchar, BeginDate) From #Temp) + '</BeginDate>' 
SET @strXml = @strXml + '<EndDate>' + (Select Convert(nvarchar, EndDate) From #Temp) + '</EndDate>' 
SET @strXml = @strXml + '<RawHtml>' + (Select RawHtml From #Temp) + '</RawHtml>' 
SET @strXml = @strXml + '<FocusPromoInd>' + Convert(nvarchar, 0) + '</FocusPromoInd>' 
SET @strXml = @strXml + '<ParentPromoCode>' + (Select ParentPromoCode From #Temp) + '</ParentPromoCode>' 
SET @strXml = @strXml + '<ActiveInd>' + (Select Case When ActiveInd=1 Then '1' Else '0' End From #Temp) + '</ActiveInd>' 
SET @strXml = @strXml + '<AreaID>' + (Select Convert(nvarchar, AreaID) From #Temp) + '</AreaID>' 
SET @strXml = '<PromoData><Promotion>' + @strXml + '</Promotion></PromoData>' 
Select @strXml as strXML 

而当我运行最后一个查询时,它返回null。即使在调试模式下,我也无法看到每行上的值更新为@strXml。请帮忙!谢谢。

+0

您是否将任何值连接为NULL?我的记忆似乎认为在SQL中NULL +任何东西总是NULL。有些格式可以很好地使这更容易阅读。 – btlog 2010-08-03 18:06:21

+0

那么,如果SET的全都是SELECT的话会不会更好? – Fosco 2010-08-03 18:08:06

回答

5

您连接的字段之一为空。

无论何时在SQL中连接字符串和空值,结果都为空。

可以使用COALESCE命令来解决这个问题:

declare @strXml nvarchar(max) = '' 
set @strXml = '<PromoName>' + (select coalesce(PromoName, '') from #Temp) + 
    '</PromoName>' 
-- and so on 
+0

哦,非常感谢。这很容易,溜走了。如果任何一个字段返回Null,它就不会工作。我很欣赏Justin。谢谢! – 2010-08-03 18:21:58

1

如果您连接与空字符串,则结果为空。因此,如果只有其中一个值为null,则整个结果将以空值结束。

您可以使用isnull(... , '')将任何可能为空值的值转换为空字符串。

而且,而是采用了很多选择的同一个表,你可以使用一个选择:

select @strXml = 
    '<PromoData><Promotion>' + 
    '<PromoName>' + PromoName + '</PromoName>' + 
    '<PromoCode>' + PromoCode + '</PromoCode>' + 
    ... 
    '<AreaID>' + convert(nvarchar, AreaID) + '</AreaID>' 
    '</Promotion></PromoData>' 
from #Temp 
1

如果任何一个串联的值是NULL,比得到的字符串也NULL 。如果您只是希望NULL值为空,则可以使用其中一个SQL NULL函数返回空字符串。有关不同SQL引擎支持的功能的完整列表,请参阅W3Schools SQL NULL Functions

1

任何包含NULL的表达式都计算为NULL。因此,任何列中的单个NULL都会清除所有其他值。您可以使用ISNULL函数来解决此问题。考虑以这种方式构建您的代码:

DECLARE @xml nvarchar(max) 

SET @xml = 
(
    SELECT ISNULL(PromoName,'') AS PromoName 
     , ISNULL(PromoDesc,'') AS PromoDesc 
     , ISNULL(PromoCode,'') AS PromoCode 
     --etc. 
    FROM #Temp 
    FOR XML RAW('Promotion'), ELEMENTS 
) 

本示例还使用简单版本的SQLServer FOR XML子句。如果您正在使用TSQL将数据转换为XML字符串,我建议您查看该语言功能。这种技术不适用于其他数据库平台。

1

正如其他人指出的那样,用NULL连接字符串会产生NULL。 SQL Server有一个选项来控制这个,所以在查询之前先输入SET CONCAT_NULL_YIELDS_NULL OFF即可解决你的问题。

+0

时间不长...它正在被切割... – gbn 2010-08-03 18:33:20