집 >데이터 베이스 >MySQL 튜토리얼 >중첩된 FOR XML PATH 쿼리에서 중복 네임스페이스 선언을 제거하는 방법은 무엇입니까?
중첩된 FOR XML PATH 쿼리에서 중복 네임스페이스 선언 제거
WITH XMLNAMESPACES를 사용하여 선언된 기본 네임스페이스가 있는 FOR XML PATH 쿼리에서는 다음이 일반적입니다. 중첩된 쿼리에서 중복된 네임스페이스 선언이 발생합니다. 이 문서에서는 이 문제를 다루고 최적의 솔루션을 제공합니다.
하위 쿼리가 FOR XML을 사용하고 외부 쿼리에서 기본 네임스페이스를 상속할 때 문제가 발생합니다. 이로 인해 하위 쿼리 노드에 대한 네임스페이스 선언이 여러 개 생성됩니다. 다양한 온라인 솔루션이 있지만 이 문제를 완전히 해결하는 솔루션은 없습니다.
최적의 솔루션
광범위한 실험 끝에 다음 솔루션이 가장 효과적인 것으로 간주되었습니다.
DECLARE @Order TABLE (OrderID INT, OrderDate DATETIME) DECLARE @OrderDetail TABLE (OrderID INT, ItemID VARCHAR(1), Name VARCHAR(50), Qty INT) INSERT @Order VALUES (1, '2010-01-01'), (2, '2010-01-02') INSERT @OrderDetail VALUES (1, 'A', 'Drink', 5), (1, 'B', 'Cup', 2), (2, 'A', 'Drink', 2), (2, 'C', 'Straw', 1), (2, 'D', 'Napkin', 1) -- FOR XML PATH query 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) -- Magic happens here! SELECT 1 AS Tag ,NULL AS Parent ,@xml AS [xml!1!!xmltext] ,'http://test.com/order' AS [xml!1!xmlns] FOR XML EXPLICIT
이 솔루션은 FOR XML EXPLICIT 쿼리를 활용하여 FOR XML PATH 쿼리 결과를 래핑하여 원치 않는 네임스페이스를 효과적으로 제거합니다. 선언.
결과
이 쿼리의 출력은 다음과 같습니다.
<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 쿼리에서 중복 네임스페이스 선언을 제거하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!