gpt4 book ai didi

sql-server - 使用 T-SQL FOR XML PATH 删除空的 XML 节点

转载 作者:行者123 更新时间:2023-12-01 11:49:02 24 4
gpt4 key购买 nike

我正在使用 FOR XML PATH从 SQL Server 2008R2 中的表构造 XML。 XML 必须构造如下:

<Root>
<OuterElement>
<NumberNode>1</NumberNode>
<FormattedNumberNode>0001</KFormattedNumberNode>
<InnerContainerElement>
<InnerNodeOne>0240</InnerNodeOne>
<InnerNodeStartDate>201201</InnerNodeStartDate>
</InnerContainerElement>
</OuterElement>
</Root>

根据架构文件, InnerContainerElement是可选的,而 InnerNodeOne是必须的。架构文件不是由我设置的,非常复杂,相互引用并且没有明确的 XSD 命名空间,因此我无法轻松将它们加载到数据库中。

XML 必须从一个表中创建,该表使用以下查询填充:
SELECT
1 AS NumberNode
, '0001' AS [FormattedNumberNode]
, '0240' AS [InnerNodeOne]
, '201201' AS [InnerNodeStartDate]
INTO #temporaryXMLStore
UNION
SELECT
2 AS NumberNode
, '0001' AS [FormattedNumberNode]
, NULL AS [InnerNodeOne]
, NULL AS [InnerNodeStartDate]

我可以想到两种方法来用 FOR XML PATH 构造这个 XML .

1) 使用 'InnerContainerElement' 作为来自 XML 子查询的命名结果:
SELECT
NumberNode
, [FormattedNumberNode]
, (
SELECT
[InnerNodeOne]
, [InnerNodeStartDate]
FOR XML PATH(''), TYPE
) AS [InnerContainerElement]
FROM #temporaryXMLStore
FOR XML PATH('OuterElement'), ROOT('Root') TYPE

2) 使用“InnerContainerElement”作为来自 XML 子查询的输出元素,但没有命名:
SELECT
NumberNode
, [FormattedNumberNode]
, (
SELECT
[InnerNodeOne]
, [InnerNodeStartDate]
FOR XML PATH('InnerContainerElement'), TYPE
)
FROM #temporaryXMLStore
FOR XML PATH('OuterElement'), ROOT('Root'), TYPE

然而,它们都没有给出想要的结果:在这两种情况下,结果看起来都像
<Root>
<OuterElement>
<NumberNode>1</NumberNode>
<FormattedNumberNode>0001</FormattedNumberNode>
<InnerContainerElement>
<InnerNodeOne>0240</InnerNodeOne>
<InnerNodeStartDate>201201</InnerNodeStartDate>
</InnerContainerElement>
</OuterElement>
<OuterElement>
<NumberNode>2</NumberNode>
<FormattedNumberNode>0001</FormattedNumberNode>
<InnerContainerElement></InnerContainerElement>
<!-- Or, when using the second codeblock: <InnerContainerElement /> -->
</OuterElement>
</Root>

每当 InnerContainerElement为空,仍显示为空元素。根据架构,这是无效的:每当元素 InnerContainerElement在 XML 中, InnerNodeOne也是必需的。

我如何构建我的 FOR XML PATH以这样的方式查询 InnerContainerElement每当它为空时就被排除在外?

最佳答案

您需要确保 InnerContainerElement在没有内容的情况下有零行。

select T.NumberNode,
T.FormattedNumberNode,
(
select T.InnerNodeOne,
T.InnerNodeStartDate
where T.InnerNodeOne is not null or
T.InnerNodeStartDate is not null
for xml path('InnerContainerElement'), type
)
from #temporaryXMLStore as T
for xml path('OuterElement'), root('Root')

或者您可以指定元素 InnerContainerElement作为列别名的一部分。
select T.NumberNode,
T.FormattedNumberNode,
T.InnerNodeOne as 'InnerContainerElement/InnerNodeOne',
T.InnerNodeStartDate as 'InnerContainerElement/InnerNodeStartDate'
from #temporaryXMLStore as T
for xml path('OuterElement'), root('Root')

关于sql-server - 使用 T-SQL FOR XML PATH 删除空的 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13468748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com