문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문

유형 시스템(XQuery)

XQuery는 유형 지정이 엄격한 언어이며 형식화되지 않은 데이터에 대해서는 유형 지정이 엄격하지 않은 언어입니다. XQuery의 미리 정의된 유형에는 다음이 포함됩니다.

  • http://www.w3.org/2001/XMLSchema 네임스페이스에 있는 XML 스키마의 기본 제공 유형

  • http://www.w3.org/2004/07/xpath-datatypes 네임스페이스에 정의된 유형

이 항목에서는 다음에 대해서도 설명합니다.

XML 스키마의 기본 제공 유형에는 xs의 미리 정의된 네임스페이스 접두사가 있습니다. 이러한 유형 중 일부에는 xs:integerxs:string이 포함됩니다. 이러한 모든 기본 제공 유형이 지원됩니다. 이러한 유형은 XML 스키마 컬렉션을 만들 때 사용할 수 있습니다.

형식화된 XML을 쿼리할 때 노드의 정적 및 동적 유형은 쿼리 중인 열 또는 변수와 연결된 XML 스키마 컬렉션에 의해 결정됩니다. 정적 및 동적 유형에 대한 자세한 내용은 식 컨텍스트 및 쿼리 평가(XQuery)를 참조하십시오. 예를 들어 다음 쿼리는 형식화된 xml 열(Instructions)에 대해 지정됩니다. 이 식에서는 instance of를 사용하여 반환된 LotSize 특성의 형식화된 값이 xs:decimal 유형인지 확인합니다.

SELECT Instructions.query('
   DECLARE namespace AWMI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
   data(/AWMI:root[1]/AWMI:Location[@LocationID=10][1]/@LotSize)[1] instance of xs:decimal
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7

이 유형 지정 정보는 열과 연결된 XML 스키마 컬렉션에 의해 제공됩니다.

http://www.w3.org/2004/07/xpath-datatypes 네임스페이스에 정의된 유형에는 xdt의 미리 정의된 접두사가 포함됩니다. 이러한 유형에는 다음이 적용됩니다.

  • XML 스키마 컬렉션을 만들 때는 이러한 유형을 사용할 수 없습니다. 이러한 유형은 XQuery 유형 시스템에 사용되며 XQuery 및 정적 형식 지정에 사용됩니다. 예를 들어 xdt 네임스페이스에 있는 원자 유형인 xdt:untypedAtomic으로 캐스팅할 수 있습니다.

  • 형식화되지 않은 XML을 쿼리할 때 요소 노드의 정적 및 동적 유형은 xdt:untyped이며 특성 값 유형은 xdt:untypedAtomic입니다. query() 메서드의 결과는 형식화되지 않은 XML을 생성합니다. 즉, XML 노드가 각각 xdt:untypedxdt:untypedAtomic으로 반환됩니다.

  • xdt:dayTimeDuration xdt:yearMonthDuration 유형은 지원되지 않습니다.

다음 예에서는 형식화되지 않은 XML 변수에 대해 쿼리가 지정됩니다. data(/a[1]) 식은 원자 값의 시퀀스를 반환합니다. data() 함수는 <a> 요소의 형식화된 값을 반환합니다. 쿼리 중인 XML이 형식화되지 않았기 때문에 반환된 값의 유형은 xdt:untypedAtomic입니다. 따라서 instance of는 True를 반환합니다.

DECLARE @x xml
SET @x='<a>20</a>'
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )

형식화된 값을 검색하는 대신 다음 예의 식(/a[1])은 <a> 요소의 시퀀스를 반환합니다. instance of 식은 요소 테스트를 사용하여 식에 의해 반환된 값이 xdt:untyped type의 요소 노드인지 확인합니다.

DECLARE @x xml
SET @x='<a>20</a>'
-- Is this an element node whose name is "a" and type is xdt:untyped.
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')
-- Is this an element node of type xdt:untyped.
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')
-- Is this an element node?
SELECT @x.query( '/a[1] instance of element()')
참고참고

형식화된 XML 인스턴스를 쿼리 중이고 쿼리 식에 부모 축이 포함된 경우 결과 노드의 정적 유형 정보는 더 이상 사용할 수 없습니다. 하지만 동적 유형은 노드와 계속 연결되어 있습니다.

모든 노드에는 형식화된 값과 문자열 값이 있습니다. 형식화된 XML 데이터의 경우 형식화된 값의 유형은 쿼리 중인 열 또는 변수와 연결된 XML 스키마 컬렉션에 의해 제공됩니다. 형식화되지 않은 XML 데이터의 경우 형식화된 값의 유형은 xdt:untypedAtomic입니다.

data() 또는 string() 함수를 사용하여 노드의 값을 검색할 수 있습니다.

다음 XML 스키마 컬렉션에서는 정수 유형의 <root> 요소가 정의됩니다.

CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema">
      <element name="root" type="integer"/>
</schema>'
GO

다음 예에서는 식이 먼저 /root[1]의 형식화된 값을 검색한 다음 여기에 3을 더합니다.

DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')

다음 예에서는 식에 있는 string(/root[1])이 문자열 유형의 값을 반환하기 때문에 식이 실패합니다. 그런 다음 피연산자로 숫자 유형의 값만 사용하는 산술 연산자로 이 값이 전달됩니다.

-- Fails because the argument is string type (must be numeric primitive type).
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('string(/root[1]) + 3')

다음 예에서는 LaborHours 특성의 합계를 계산합니다. data() 함수는 제품 모델에 대한 모든 <Location> 요소에서 LaborHours 특성의 형식화된 값을 검색합니다. Instruction 열과 연결된 XML 스키마에 따라 LaborHours 유형은 xs:decimal이 됩니다.

SELECT Instructions.query(' 
DECLARE namespace AWMI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"; 
             sum(data(//AWMI:Location/@LaborHours)) 
') AS Result 
FROM Production.ProductModel 
WHERE ProductModelID=7

이 쿼리는 결과로 12.75를 반환합니다.

참고참고

이 예에서 data() 함수는 설명을 위해 명시적으로 사용되었습니다. 이 함수가 지정되어 있지 않으면 sum()data() 함수를 암시적으로 적용하여 노드의 형식화된 값을 추출합니다.

커뮤니티 추가 항목

추가
표시: