SQL Server FOR XML查询NULL列无空标签,如何调整语句输出空元素?
解决方案
SQL Server的FOR XML语句默认使用ELEMENTS参数时,会自动跳过值为NULL的列,不会生成对应的XML标签,可通过以下两种方案解决:
方案1:使用ELEMENTS XSINIL(原生支持,生成带NULL标记的标签)
直接修改FOR XML子句的参数,新增XSINIL关键字即可,该参数会强制为所有NULL列生成带xsi:nil="true"属性的标签:
SELECT Data.value('(/Data/Reference)[1]', 'nvarchar(10)') AS PolicyNumber, [RequestId], [BatchEntryId], [StatusCode], [PaymentMethodCode], Data.value('(/Data/Amount)[1]', 'nvarchar(10)') AS Amount FROM [dbo].[TransmissionData] WHERE RequestId = 2031070233 FOR XML RAW ('RequestRecord'), ELEMENTS XSINIL, TYPE
该方案输出的BatchEntryId标签格式为:
<BatchEntryId xsi:nil="true"/>
方案2:转换NULL为空字符串(生成纯自闭合空标签,完全符合需求)
如果不需要xsi:nil属性,仅需要纯自闭合空标签,可以通过ISNULL函数将可能为NULL的字段转换为空字符串,这样FOR XML就会生成对应的空标签:
SELECT Data.value('(/Data/Reference)[1]', 'nvarchar(10)') AS PolicyNumber, [RequestId], ISNULL(CAST([BatchEntryId] AS VARCHAR(50)), '') AS [BatchEntryId], [StatusCode], [PaymentMethodCode], Data.value('(/Data/Amount)[1]', 'nvarchar(10)') AS Amount FROM [dbo].[TransmissionData] WHERE RequestId = 2031070233 FOR XML RAW ('RequestRecord'), ELEMENTS, TYPE
注:如果
BatchEntryId本身就是字符串类型,可以去掉CAST转换,直接写ISNULL([BatchEntryId], '') AS [BatchEntryId]即可。
该方案输出的BatchEntryId标签完全符合预期:
<BatchEntryId/>
内容的提问来源于stack exchange,提问作者Kannan
相关产品推荐
相关产品推荐

