다음을 통해 공유


XQuery에서 네임스페이스 처리

적용 대상:SQL Server

이 항목에서는 쿼리에서 네임스페이스를 처리하기 위한 샘플을 제공합니다.

A. 네임스페이스 선언

다음 쿼리는 특정 제품 모델의 제조 단계를 검색합니다.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        /AWMI:root/AWMI:Location[1]/AWMI:step  
    ') as x  
FROM Production.ProductModel  
WHERE ProductModelID=7  

다음은 부분 결과입니다.

<AWMI:step xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <AWMI:material>aluminum sheet MS-2341</AWMI:material> into the <AWMI:tool>T-85A framing tool</AWMI:tool>. </AWMI:step>  
...  

네임스페이스 키워드는 새 네임스페이스 접두사 "AWMI:"를 정의하는 데 사용됩니다. 그런 다음 해당 네임스페이스의 범위에 포함되는 모든 요소에 대해 쿼리에서 이 접두사를 사용해야 합니다.

B. 기본 네임스페이스 선언

이전 쿼리에서 새 네임스페이스 접두사를 정의했습니다. 그런 다음 쿼리에서 해당 접두사를 사용하여 의도한 XML 구조를 선택해야 했습니다. 이 방법 외에 다음 수정된 쿼리에서와 같이 네임스페이스를 기본 네임스페이스로 선언할 수 있습니다.

SELECT Instructions.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        /root/Location[1]/step  
    ') as x  
FROM Production.ProductModel  
where ProductModelID=7  

결과입니다.

<step xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <material>aluminum sheet MS-2341</material> into the <tool>T-85A framing tool</tool>. </step>  
...  

이 예제에서는 정의된 "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"네임스페이스가 기본 네임스페이스 또는 비어 있는 네임스페이스를 재정의하도록 만들어집니다. 이 때문에 쿼리에 사용되는 경로 식에 더 이상 네임스페이스 접두사가 없습니다. 또한 결과에 표시되는 요소 이름에도 네임스페이스 접두사가 더 이상 없습니다. 또한 기본 네임스페이스는 모든 요소에 적용되지만 해당 특성에는 적용되지 않습니다.

C. XML 생성에서 네임스페이스 사용

새 네임스페이스를 정의하면 쿼리뿐만 아니라 생성에 대한 범위로 가져옵니다. 예를 들어 XML을 생성할 때 "declare namespace ..." 선언을 사용하여 새 네임스페이스를 정의한 다음 생성한 요소 및 특성과 함께 해당 네임스페이스를 사용하여 쿼리 결과 내에 표시할 수 있습니다.

SELECT CatalogDescription.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     declare namespace myNS="uri:SomeNamespace";<myNS:Result>  
          { /ProductDescription/Summary }  
       </myNS:Result>  
  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

결과는 다음과 같습니다.

  
      <myNS:Result xmlns:myNS="uri:SomeNamespace">  
  <Summary xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
   <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">  
     Our top-of-the-line competition mountain bike. Performance-enhancing   
     options include the innovative HL Frame, super-smooth front   
     suspension, and traction for all terrain.</p1:p>  
  </Summary>  
</myNS:Result>  

또는 다음 쿼리와 같이 XML 생성의 일부로 사용되는 각 지점에서 네임스페이스를 명시적으로 정의할 수도 있습니다.

SELECT CatalogDescription.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <myNS:Result xmlns:myNS="uri:SomeNamespace">  
          { /ProductDescription/Summary }  
       </myNS:Result>  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

D. 기본 네임스페이스를 사용하여 생성

생성된 XML에서 사용할 기본 네임스페이스를 정의할 수도 있습니다. 예를 들어 다음 쿼리는 요소와 같이 <Result> 생성된 로컬로 명명된 요소의 기본값으로 사용할 기본 네임스페이스 "uri:SomeNamespace"\를 지정하는 방법을 보여 있습니다.

SELECT CatalogDescription.query('  
      declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
      declare default element namespace "uri:SomeNamespace";<Result>  
          { /PD:ProductDescription/PD:Summary }  
       </Result>  
  
    ') as Result  
FROM Production.ProductModel  
where ProductModelID=19  

결과는 다음과 같습니다.

  
      <Result xmlns="uri:SomeNamespace">  
  <PD:Summary xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
   <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">  
         Our top-of-the-line competition mountain bike. Performance-  
         enhancing options include the innovative HL Frame, super-smooth   
         front suspension, and traction for all terrain.</p1:p>  
  </PD:Summary>  
</Result>  

기본 요소 네임스페이스 또는 빈 네임스페이스를 재정의하면 생성된 XML의 로컬로 명명된 모든 요소가 나중에 재정의되는 기본 네임스페이스에 바인딩됩니다. 따라서 빈 네임스페이스를 활용하기 위해 XML을 유연하게 생성해야 하는 경우 기본 요소 네임스페이스를 재정의하지 마세요.

참고 항목

WITH XMLNAMESPACES를 사용하여 쿼리에 네임스페이스 추가
XML 데이터(SQL Server)
XQuery 언어 참조(SQL Server)