다음을 통해 공유


데이터 접근자 함수 - 데이터(XQuery)

적용 대상:SQL Server

$arg 지정된 각 항목에 대해 형식화된 값을 반환합니다.

구문

  
fn:data ($arg as item()*) as xdt:untypedAtomic*  

인수

$arg
형식화된 값이 반환되는 항목의 시퀀스입니다.

설명

다음은 형식화된 값에 적용됩니다.

  • 원자성 값의 형식화된 값은 원자성 값입니다.

  • 텍스트 노드의 형식화된 값은 텍스트 노드의 문자열 값입니다.

  • 주석의 형식화된 값은 주석의 문자열 값입니다.

  • 처리 명령의 형식화된 값은 처리 명령 대상 이름이 없는 처리 명령의 내용입니다.

  • 문서 노드의 형식화된 값은 문자열 값입니다.

다음은 특성 및 요소 노드에 적용됩니다.

  • 특성 노드가 XML 스키마 형식으로 입력된 경우 형식화된 값은 그에 따라 형식화된 값입니다.

  • 특성 노드가 형식화되지 않은 경우 형식화된 값은 xdt:untypedAtomic인스턴스로 반환되는 문자열 값과 같습니다.

  • 요소 노드가 형식화되지 않은 경우 형식화된 값은 xdt:untypedAtomic인스턴스로 반환되는 문자열 값과 같습니다.

다음은 형식화된 요소 노드에 적용됩니다.

  • 요소에 단순 콘텐츠 형식 이 있는 경우 data() 는 요소의 형식화된 값을 반환합니다.

  • 노드가 xs:anyType을 포함하여 복합 형식인 경우 data() 는 정적 오류를 반환합니다.

다음 예제와 같이 data() 함수를 사용하는 것은 선택 사항이지만 data() 함수를 지정하면 쿼리 가독성이 명시적으로 증가합니다. 자세한 내용은 XQuery 기본 사항을 참조 하세요.

다음과 같이 생성된 XML에 데이터()를 지정할 수 없습니다.

declare @x xml  
set @x = ''  
select @x.query('data(<SomeNode>value</SomeNode>)')  

이 항목에서는 AdventureWorks 데이터베이스의 다양한 xml 형식 열에 저장된 XML 인스턴스에 대한 XQuery 예제를 제공합니다.

A. data() XQuery 함수를 사용하여 노드의 형식화된 값 추출

다음 쿼리는 data() 함수를 사용하여 특성, 요소 및 텍스트 노드의 값을 검색하는 방법을 보여 줍니다.

WITH XMLNAMESPACES (  
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,  
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)  
  
SELECT CatalogDescription.query(N'  
 for $pd in //p1:ProductDescription  
 return   
    <Root   
      ProductID = "{ data( ($pd//@ProductModelID)[1] ) }"   
      Feature =   "{ data( ($pd/p1:Features/wm:Warranty/wm:Description)[1] ) }" >  
    </Root>  
 ') as Result  
FROM Production.ProductModel  
WHERE ProductModelID = 19  

결과는 다음과 같습니다.

<Root ProductID="19" Feature="parts and labor"/>  

언급했듯이 특성을 생성할 때 data() 함수는 선택 사항입니다. data() 함수를 지정하지 않으면 암시적으로 가정됩니다. 다음 쿼리에서는 이전 쿼리와 동일한 결과를 생성합니다.

WITH XMLNAMESPACES (  
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,  
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)  
  
SELECT CatalogDescription.query('  
      for $pd in //p1:ProductDescription  
         return   
          <Root    
                ProductID = "{ ($pd/@ProductModelID)[1] }"    
                Feature =   "{ ($pd/p1:Features/wm:Warranty/wm:Description)[1] }" >  
           </Root>  
 ') as Result  
FROM Production.ProductModel  
WHERE ProductModelID = 19  

다음 예제에서는 data() 함수가 필요한 인스턴스를 보여 줍니다.

다음 쿼리 에서 $pd/p1:Specifications/Material 은 <Material> 요소를 반환합니다. 또한 data($pd/p1:Specifications/Material)는 형식화되지 않으므로 xdt:untypedAtomic <Material> 으로 형식화된 문자 데이터를 반환합니다. 입력을 형식화하지 않으면 data()결과가 xdt:untypedAtomic으로 입력됩니다.

SELECT CatalogDescription.query('  
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
      for $pd in //p1:ProductDescription  
         return   
          <Root>  
             { $pd/p1:Specifications/Material }  
             { data($pd/p1:Specifications/Material) }  
           </Root>  
 ') as Result  
FROM Production.ProductModel  
WHERE ProductModelID = 19  

결과는 다음과 같습니다.

<Root>  
  <Material>Almuminum Alloy</Material>Almuminum Alloy  
</Root>  

다음 쿼리 에서 data($pd/p1:Features/wm:Warranty) 는 복합 형식 요소이므로 정적 오류를 <Warranty> 반환합니다.

WITH XMLNAMESPACES (  
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,  
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)  
  
SELECT CatalogDescription.query('  
 <Root>  
   {     /p1:ProductDescription/p1:Features/wm:Warranty }  
   { data(/p1:ProductDescription/p1:Features/wm:Warranty) }  
 </Root>  
 ') as Result  
FROM  Production.ProductModel  
WHERE ProductModelID = 23  

참고 항목

xml 데이터 형식에 대한 XQuery 함수