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>)')
예
이 항목에서는 AdventureWorks 데이터베이스의 다양한 xml 유형 열에 저장된 XML 인스턴스에 대한 XQuery 예를 제공합니다. 이러한 각 열에 대한 개요는 AdventureWorks 데이터베이스의 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