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