data 함수(XQuery)

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

구문

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

인수

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

주의

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

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

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

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

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

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

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

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

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

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

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

  • 요소에 간단한 내용 유형이 있는 경우 **data()**는 이 요소의 형식화된 값을 반환합니다.

  • 노드가 xs:anyType과 같은 복합 유형인 경우 **data()**는 정적 오류를 반환합니다.

다음 예에서와 같이 data() 함수가 자주 선택적으로 사용되는 경우 data() 함수를 명시적으로 지정하면 쿼리 가독성이 향상됩니다. 자세한 내용은 XQuery 기초를 참조하십시오.

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

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

이 항목에서는 AdventureWorks2008R2 데이터베이스의 다양한 xml 유형 열에 저장된 XML 인스턴스에 대한 XQuery 예를 보여 줍니다. 이러한 각 열에 대한 개요는 AdventureWorks2008R2 데이터베이스의 xml 데이터 형식 표시를 참조하십시오.

1. 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)**은 <Material>이 형식화되지 않았으므로 xdt:untypedAtomic으로 형식화된 문자 데이터를 반환합니다. 입력이 형식화되지 않은 경우 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;