2

在处理完所有困难的事情后,我可能正在尝试做一件简单的事情,但这似乎让我头疼。我正在尝试将文本连接到变量 @strXml 中,该变量是用于构建 Xml 元素的 nvarchar 变量,但 @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 更新了每一行的值。请帮忙!谢谢。

4

5 回答 5

5

您要连接的字段之一为空。

任何时候你在 SQL 中连接一个字符串和一个空值,结果都是空的。

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

declare @strXml nvarchar(max) = ''
set @strXml = '<PromoName>' + (select coalesce(PromoName, '') from #Temp) +
    '</PromoName>'
-- and so on
于 2010-08-03T18:06:29.970 回答
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
于 2010-08-03T18:08:52.087 回答
1

如果连接中的任何值是 NULL,则结果字符串也是 NULL。如果您只是希望 NULL 值为空白,则可以使用 SQL NULL 函数之一来代替返回空字符串。有关不同 SQL 引擎支持的函数的完整列表,请参阅W3Schools SQL NULL 函数。

于 2010-08-03T18:09:32.117 回答
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 字符串,我建议您看看这个语言特性。此技术不适用于其他数据库平台。

于 2010-08-03T18:10:27.353 回答
1

正如其他人指出的那样,将字符串与 NULL 连接会产生 NULL。SQL Server 有一个选项来控制这一点,所以把SET CONCAT_NULL_YIELDS_NULL OFF你的查询放在前面应该可以纠正你的问题。

于 2010-08-03T18:13:12.123 回答