> 데이터 베이스 > MySQL 튜토리얼 > 중첩된 FOR XML PATH 쿼리에서 중복 네임스페이스 선언을 제거하는 방법은 무엇입니까?

중첩된 FOR XML PATH 쿼리에서 중복 네임스페이스 선언을 제거하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-31 02:44:09
원래의
147명이 탐색했습니다.

How to Eliminate Redundant Namespace Declarations in Nested FOR XML PATH Queries?

중첩된 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 쿼리 결과를 래핑하여 원치 않는 네임스페이스를 효과적으로 제거합니다. 선언.

  1. @xml AS [xml!1!!xmltext]: 이 지시문은 더미 루트 노드를 제외하고 FOR XML PATH 결과에서 추출할 XML 콘텐츠를 지정합니다.
  2. 'http://test.com/order' AS [xml!1!xmlns]: 이 지시어는 가장 바깥쪽 노드에 대해 원하는 네임스페이스를 명시적으로 설정하여 중첩된 선언의 중복 선언을 제거합니다. 쿼리.

결과

이 쿼리의 출력은 다음과 같습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿