首页 > 解决方案 > 如何在 SQL 中拆分两个具有相同子名称的 xml 标签

问题描述

我创建了一个脚本,它从 SQL 中的表中获取数据并生成 XML 输出。父、子和子标签都是相同的,对于 2 个标签。SQL 脚本将它们作为一个 XML 值而不是 2 个输出。

 SELECT
 Request.TransactionRef AS [RequestHeader/RequestID],
'Deal.Trial' AS [RequestHeader/Action],
'DoDealValidate' AS [RequestHeader/ActionFlags/Flag],
'DoDealDerive' AS [RequestHeader/ActionFlags/Flag] 

目前的结果是:

<ActionFlags>
<Flag>DoDealValidateDoDealDerive</Flag>
</ActionFlags>




<ActionFlags>
<Flag>DoDealValidate</Flag>
<Flag>DoDealDerive</Flag>
</ActionFlags>

标签: sql-serverxmltsqlxpathfor-xml

解决方案


只需在两者之间放置一些的东西:

SELECT
 'blah' AS [RequestHeader/RequestID],
'Deal.Trial' AS [RequestHeader/Action],
'DoDealValidate' AS [RequestHeader/ActionFlags/Flag],
NULL AS [RequestHeader/ActionFlags],
'DoDealDerive' AS [RequestHeader/ActionFlags/Flag] 
FOR XML PATH('row');

的背景:

引擎在 SELECT 的列中运行并一个接一个地构建它们。

  • 嗯,有一个<RequestHeader>可以打开
  • 并且有一个<RequestID>可以打开
  • 再次<RequestHeader>,仍然开放,没什么可去的
  • 还有<Action>下面...哦,我们必须关闭<RequestID>并打开一个新的<Action>
  • 等等...

在您的代码<Flag>中仍然是打开的,因此内容被写入打开的元素。

我的改变会让引擎思考

  • 啊,我们上一层,所以我们关闭了<Flag>第一个……哎呀,没有什么可写的了……
  • 现在有一些 for <Flag>,它不再打开了,我们必须重新打开一个(新)<Flag>节点
  • 等等...

推荐阅读