ホームページ >データベース >mysql チュートリアル >ネストされた「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 サイトの他の関連記事を参照してください。