【问题标题】:Including field in XML output if not empty, leave out when empty如果不为空,则在 XML 输出中包含字段,为空时省略
【发布时间】:2015-04-30 05:54:42
【问题描述】:

我在这里的第一个问题,但我已经从这个伟大的网站阅读和学习了很多东西。 简短的介绍,我是一家全球公司的应用程序支持专家。 11 月开始,但已经忙于工作。

目前我正在从我们的 SQL Server 环境创建 XML 文件,以便向匈牙利海关申报我们的货物。在 Stackoverflow 线程的帮助下,一切都已经很好了。 现在我正在执行微调任务,并且正在努力解决以下问题。

在 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

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

现在结果如下;

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

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

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

【问题讨论】:

  • 如果您的查询返回多行且有些手机是空的而有些则不是,该怎么办?
  • 这是 XML 的一部分,仅包含一次,但要回答您的问题;如果某些位置有电话而其他位置没有,那么我想将电话包含在有电话的结果中,并将电话标签从没有电话的结果中删除。

标签: sql xml sql-server-2008


【解决方案1】:

我的猜测是你有空字符串而不是 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

【讨论】:

  • 谢谢 Rhys,试试这个。
  • 你是对的 Rhys,我确实有空字符串而不是 NULL。这就像一个魅力。非常感谢。 :)
猜你喜欢
  • 2016-07-26
  • 2023-02-20
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2013-11-14
  • 1970-01-01
相关资源
最近更新 更多