nvarchar连接问题

时间:2010-08-03 18:02:26

标签: sql nvarchar

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

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的值。请帮忙!感谢。

5 个答案:

答案 0 :(得分:5)

您正在连接的其中一个字段为空。

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

您可以使用COALESCE命令修复:

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

答案 1 :(得分:1)

如果将字符串与null连接,则结果为null。因此,如果您获得的值中只有一个为null,则整个结果将最终为null。

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

此外,您可以使用单个选择:

,而不是使用同一个表中的大量选项
select @strXml =
  '<PromoData><Promotion>' +
  '<PromoName>' + PromoName + '</PromoName>' +
  '<PromoCode>' + PromoCode + '</PromoCode>' +
  ...
  '<AreaID>' + convert(nvarchar, AreaID) + '</AreaID>'
  '</Promotion></PromoData>'
from #Temp

答案 2 :(得分:1)

如果串联中的任何值为NULL,则结果字符串也为NULL。如果您只想让NULL值为空,那么您可以使用其中一个SQL NULL函数来返回空字符串。有关不同SQL引擎支持的函数的完整列表,请参阅W3Schools SQL NULL Functions

答案 3 :(得分: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字符串,我建议您查看此语言功能。此技术不适用于其他数据库平台。

答案 4 :(得分:1)

正如其他人所指出的,将字符串与NULL连接会产生NULL。 SQL Server有一个控制它的选项,因此在查询之前放置SET CONCAT_NULL_YIELDS_NULL OFF应该可以解决您的问题。