중첩된 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!