如果不为空,则在 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
这是我的第一个问题,但我一直在阅读这个很棒的网站并从中学到了很多东西。 简短介绍,我是一家全球公司的应用程序支持专家。 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