在处理所有困难的事情之后,我可能会尝试做一件简单的事情但看起来这让我很头疼。我试图将文本连接到变量@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的值。请帮忙!感谢。
答案 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
应该可以解决您的问题。