如果不为空,则在 XML 输出中包含字段,如果为空,则省略

Including field in XML output if not empty, leave out when empty

这是我的第一个问题,但我一直在阅读这个很棒的网站并从中学到了很多东西。 简短介绍,我是一家全球公司的应用程序支持专家。 11 月开始,但已经被工作淹没了。

目前,我正在努力从我们的 SQL 服务器环境创建 XML 文件,以向匈牙利海关申报我们的货物。在 Whosebug 线程的帮助下,一切都已经运行良好。 现在我正在执行微调任务,我正在为以下问题而苦苦挣扎。

在 XML 中有一些可选字段,有时需要填写,但并非总是如此。麻烦的是,当该字段为空时,XML 将失败。因此,当为空时,不应包含完整标签。当填写该字段时,标签和数据应包含在 XML 文件中。

示例;

 SELECT    [LocationName] as name
          ,[LocationPhone] as phone
          ,[LocationEmail] as email
          ,[LocationCountry] as country
          ,[LocationCity] as city
    FROM [XML_view]
    FOR XML PATH ('Location'), ELEMENTS, TYPE

姓名、国家和城市是必填项并且始终填写,但 Phone 和电子邮件可能为空也可能不为空。

现结果如下;

<Location 
  <name>BuildingOne</name>
  <phone />
  <email />
  <country>NL</country>
  <city>Amsterdam</city>
</Location>

但我希望 phone 和电子邮件在它们为空时不在 XML 中。

我尝试使用 IF EXISTS 和 IF NOT NULL,但这不起作用。 有人有什么建议吗?

我猜你有空字符串而不是 NULL 值。这显示了差异;

;with cte as (
select 'John' as [LocationName], '0123456789' as [LocationPhone], 'john@smith.com' as [LocationEmail],'UK' as [LocationCountry],'London' as [LocationCity]
union all
select 'Peter' as [LocationName], '' as [LocationPhone], '' as [LocationEmail],'UK' as [LocationCountry],'Sheffield' as [LocationCity]
union all
select 'Sally' as [LocationName], null as [LocationPhone], null as [LocationEmail],'UK' as [LocationCountry],'Reading' as [LocationCity]
)
 SELECT    [LocationName] as name
          ,[LocationPhone] as phone
          ,[LocationEmail] as email
          ,[LocationCountry] as country
          ,[LocationCity] as city
    FROM cte
    FOR XML PATH ('Location'), ELEMENTS, TYPE

您可以使用 NULLIF 将空字符串更改为 NULL,它们将从 XML;

中消失
;with cte as (
select 'John' as [LocationName], '0123456789' as [LocationPhone], 'john@smith.com' as [LocationEmail],'UK' as [LocationCountry],'London' as [LocationCity]
union all
select 'Peter' as [LocationName], '' as [LocationPhone], '' as [LocationEmail],'UK' as [LocationCountry],'Sheffield' as [LocationCity]
union all
select 'Sally' as [LocationName], null as [LocationPhone], null as [LocationEmail],'UK' as [LocationCountry],'Reading' as [LocationCity]
)
 SELECT    nullif([LocationName], '') as name
          ,nullif([LocationPhone], '') as phone
          ,nullif([LocationEmail], '') as email
          ,nullif([LocationCountry], '') as country
          ,nullif([LocationCity], '') as city
    FROM cte
    FOR XML PATH ('Location'), ELEMENTS, TYPE