在“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中文网其他相关文章!