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)