首页 > 数据库 > mysql教程 > 如何消除嵌套'FOR XML PATH”查询中的冗余命名空间声明?

如何消除嵌套'FOR XML PATH”查询中的冗余命名空间声明?

Linda Hamilton
发布: 2025-01-02 16:21:40
原创
996 人浏览过

How Can I Eliminate Redundant Namespace Declarations in Nested

“FOR XML PATH”查询中的嵌套命名空间消除

在“FOR XML PATH”查询的上下文中使用“WITH XMLNAMESPACES”定义默认命名空间、嵌套查询可以在顶层引入冗余的命名空间声明。当子查询在嵌套查询中使用“FOR XML PATH”时,就会出现此问题。

示例:

考虑以下查询:

...
select 
    a.c2 as "@species"
    , (select l.c3 as "text()" 
       from t2 l where l.c2 = a.c1 
       for xml path('leg'), type) as "legs"
from t1 a
for xml path('animal'), root('zoo')
...
登录后复制

此处,嵌套查询为“legs”将导致“legs”上的“uri:animal”的附加命名空间声明

解决方案:

要消除这种冗余,可以在子查询中结合使用“FOR XML PATH”和主查询中的“FOR XML EXPLICIT”。此方法涉及在“FOR XML EXPLICIT”查询中使用“xmltext”指令来抑制最外层的命名空间声明。

DECLARE @xml XML = (SELECT OrderID AS "@OrderID",
                        (SELECT ItemID AS "@ItemID", 
                                Name AS "data()" 
                         FROM @OrderDetail 
                         WHERE OrderID = o.OrderID 
                         FOR XML PATH ('Item'), TYPE)
                    FROM @Order o 
                    FOR XML PATH ('Order'), ROOT('dummyTag'), TYPE)

SELECT 1 AS Tag
      ,NULL AS Parent
      ,@xml AS [xml!1!!xmltext]
      ,'http://test.com/order' AS [xml!1!xmlns]
FOR XML EXPLICIT
登录后复制

结果将是:

<xml xmlns="http://test.com/order">
  <Order OrderID="1">
    <Item ItemID="A">Drink</Item>
    <Item ItemID="B">Cup</Item>
  </Order>
  <Order OrderID="2">
    <Item ItemID="A">Drink</Item>
    <Item ItemID="C">Straw</Item>
    <Item ItemID="D">Napkin</Item>
  </Order>
</xml>
登录后复制

此技术提供“FOR XML PATH”对于嵌套查询的灵活性,同时在根节点上维护单个命名空间声明。

以上是如何消除嵌套'FOR XML PATH”查询中的冗余命名空间声明?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板