ホームページ >データベース >mysql チュートリアル >ネストされた「FOR XML PATH」クエリで冗長な名前空間宣言を削除するにはどうすればよいですか?

ネストされた「FOR XML PATH」クエリで冗長な名前空間宣言を削除するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-02 16:21:40993ブラウズ

How Can I Eliminate Redundant Namespace Declarations in Nested

「FOR XML PATH」クエリにおけるネストされた名前空間の削除

「WITH XMLNAMESPACES」を使用した「FOR XML PATH」クエリのコンテキストで、デフォルトの名前空間、ネストされたクエリを定義する最上位に冗長な名前空間宣言が導入される可能性があります。この問題は、サブクエリがネストされたクエリ内で「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" の追加の名前空間宣言が作成されます。 element.

解決策:

この冗長性を排除するには、サブクエリの "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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。